StackExchange.Redis的使用 Redis五种数据类型的应用

ConnectionMultiplexer

ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用程序应该只有一个ConnectionMultiplexer 类的实例。上一章中StackExchangeRedisHelper 的相关代码如下

  private static ConnectionMultiplexer _instance = null;
        /// <summary>
        /// 使用一个静态属性来返回已连接的实例,如下列中所示。这样,一旦 ConnectionMultiplexer 断开连接,便可以初始化新的连接实例。
        /// </summary>
        public static ConnectionMultiplexer Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_locker)
                    {
                        if (_instance == null || !_instance.IsConnected)
                        {
                            _instance = ConnectionMultiplexer.Connect(Coonstr);
                        }
                    }
                }
                //注册如下事件
                _instance.ConnectionFailed += MuxerConnectionFailed;
                _instance.ConnectionRestored += MuxerConnectionRestored;
                _instance.ErrorMessage += MuxerErrorMessage;
                _instance.ConfigurationChanged += MuxerConfigurationChanged;
                _instance.HashSlotMoved += MuxerHashSlotMoved;
                _instance.InternalError += MuxerInternalError;
                return _instance;
            }
        }

String

 string类型应该是最长用到的了,用法也很简单,下面展示了用Redis来进行基本的字符串数字存储

 public static IDatabase GetDatabase()
        {
            return Instance.GetDatabase();
        }
        /// <summary>
        /// 设置缓存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public static void Set(string key, object value, TimeSpan? expiry = default(TimeSpan?), When when = When.Always, CommandFlags flags = CommandFlags.None)
        {
            key = MergeKey(key);
            GetDatabase().StringSet(key, Serialize(value), expiry, when, flags);
        }
        /// <summary>
        /// 根据key获取缓存对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public static T Get<T>(string key)
        {
            key = MergeKey(key);
            return Deserialize<T>(GetDatabase().StringGet(key));
        }
         /// <summary>
        /// 移除指定key的缓存
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static bool Remove(string key)
        {
            key = MergeKey(key);
            return GetDatabase().KeyDelete(key);
        }    

除了基本的string类型操作,Redis同时支持以下几种类型的操作

  • List  列表
  • Set  无序集合
  • SortedSet  有序集合  
  • Hash 哈希表

下面我依次来介绍下这四种类型在StackExchange.Redis中的基本用法

关于代码中的KeyDelete为删除对应的键,我这里是因为测试防止重复才加上的。大家不要误会

List

  • 特点:有序排列,值可以重复。我们可以通过pop,push操作来从头部和尾部删除或者添加元素。这使得list既可以做栈也可以做队列
  • 需求:要求一条微博将最新的10条评论用户名字直接显示在主页上
  • 实现:
 public static void LatestUserTop10()
        {
            IDatabase db = StackExchangeRedisHelper.GetDatabase();
            //模拟有一百名用户
            for (int i = 1; i <= 100; i++)
            {
                db.ListLeftPush("user", "用户"+i);
                //每一名用户插入后都只保留最后的十个用户到redis数据库中
                db.ListTrim("user", 0, 9);
            }
            RedisValue[] userStores = db.ListRange("user");
            foreach (var item in userStores)
            {
                Console.Write((string)item + ",");
            }
            db.KeyDelete("user");
            Console.ReadLine();
        }

Set

  • 特点:无序排列,值不可重复。增加删除查询都很快。提供了取并集交集差集等一些有用的操作
  • 需求:取两篇文章的评论者的交集并集差集
  • 实现:
 public void RedisSetTest()
        {
            IDatabase db = StackExchangeRedisHelper.GetDatabase();

            for (int i = 1; i <= 20; i++)
            {
                db.SetAdd("文章1", i);
            }
            for (int i = 15; i <= 35; i++)
            {
                db.SetAdd("文章2", i);
            }
            RedisValue[] inter = db.SetCombine(SetOperation.Intersect, "文章1", "文章2");
            RedisValue[] union = db.SetCombine(SetOperation.Union, "文章1", "文章2");
            RedisValue[] dif1 = db.SetCombine(SetOperation.Difference, "文章1", "文章2");
            RedisValue[] dif2 = db.SetCombine(SetOperation.Difference, "文章2", "文章1");
            int x = 0;
            Console.WriteLine("两篇文章都评论过的用户");
            foreach (var item in inter.OrderBy(m => m).ToList())
            {
                Console.Write((string)item + "  ");
            }
            Console.WriteLine("\n评论过两篇文章中任意一篇文章的用户");
            foreach (var item in union.OrderBy(m => m).ToList())
            {
                Console.Write((string)item + "  ");
            }
            Console.WriteLine("\n只评论过其第一篇文章的用户");
            foreach (var item in dif1.OrderBy(m => m).ToList())
            {
                Console.Write((string)item + "  ");
            }
            Console.WriteLine("\n只评论过其第二篇文章的用户");
            foreach (var item in dif2.OrderBy(m => m).ToList())
            {
                Console.Write((string)item + "  ");
            }
            db.KeyDelete("文章1");
            db.KeyDelete("文章2");
            Console.ReadLine();
        }

SortedSet

  • 特点:有序排列,值不可重复。类似Set,不同的是sortedset的每个元素都会关联一个double类型的score,用此元素来进行排序
  • 需求:显示文章被赞最多的十条评论
  • 实现:
public void HotestUserTop10()
        {
            IDatabase db = StackExchangeRedisHelper.GetDatabase();
            //模拟有一百名评论者,开始每个用户被“赞”的次数为1
            List<SortedSetEntry> entrys = new List<SortedSetEntry>();
            for (int i = 1; i <= 100; i++)
            {
                db.SortedSetAdd("文章1", "评论者" + i, 1);
            }
            //评论者2又被赞了两次
            db.SortedSetIncrement("文章1", "评论者2", 2); //对应的值的score+2
            //评论者101被赞了4次
            db.SortedSetIncrement("文章1", "评论者101", 4);  //若不存在该值,则插入一个新的
            RedisValue[] userStores = db.SortedSetRangeByRank("文章1", 0, 10, Order.Descending);
            for (int i = 0; i < userStores.Length; i++)
            {
                Console.WriteLine(userStores[i]+":"+ db.SortedSetScore("文章1", userStores[i]));
            }
            db.KeyDelete("文章1");
            Console.ReadLine();
        }

Hash

  • 特点:Hash是一个string类型的field和value的对应表,它更适合来存储对象,相比于每个属性进行一次缓存,利用hash来存储整个对象会占用更小的内存。但是存储速度并不会更快
  • 需求:存储一个学生的基本信息
  • 实现:
  public void RedisHashTest()
        {
            IDatabase db = StackExchangeRedisHelper.GetDatabase();
            db.HashSet("student1", "name", "张三");
            db.HashSet("student1", "age", 12);
            db.HashSet("student1", "class", "五年级");
            Console.WriteLine(db.HashGet("student1", "name"));
            RedisValue[] result = db.HashGet("student1", new RedisValue[] { "name", "age","class" });
            Console.WriteLine(string.Join(",",result));
            db.KeyDelete("student1");
            Console.ReadLine();
        }

以下代码是我分别用stringset和hash来存储对象进行的时间及内存比较,内存可通过redis的info命令来查看。

最终显示耗时方面stringset稍微快一点点,内存占用stringset却是hash的二倍

 public void RedisHashVsStringSet()
        {
            IDatabase db = StackExchangeRedisHelper.GetDatabase();
            Stopwatch sw = new Stopwatch();
            sw.Start();
            //for (int i = 0; i < 100000; i++)
            //{
            //    db.HashSet("studenths" + i, "name", "张三" + i);
            //    db.HashSet("studenths" + i, "age", 12 + i);
            //    db.HashSet("studenths" + i, "class", "五年级" + i);
            //}
            //Console.WriteLine(sw.Elapsed.TotalMilliseconds);
            //sw.Restart();
            for (int i = 0; i < 100000; i++)
            {
                db.StringSet("studentstr_name" + i, "张三" + i);
                db.StringSet("studentstr_age" + i, 12 + i);
                db.StringSet("studentstr_class" + i, "五年级" + i);
            }
            Console.WriteLine(sw.Elapsed.TotalMilliseconds);
            //for (int i = 0; i < 100000; i++)
            //{
            //    db.KeyDelete("studenths" + i);
            //    db.KeyDelete("studentstr_name" + i);
            //    db.KeyDelete("studentstr_age" + i);
            //    db.KeyDelete("studentstr_class" + i);
            //}
            Console.ReadLine();
        }
时间: 2024-11-03 20:08:25

StackExchange.Redis的使用 Redis五种数据类型的应用的相关文章

redis的入门篇---五种数据类型及基本操作

查看所有的key keys * 清空所有的key flushall 检查key是否存在 exists key 设置已存在的key的时长 expire key 10 //设置key为10s 查看key还剩多少时长 ttl key //-1是永久 -2是不存在 查看key的类型 type key 随机取出一个key randomkey 重命名key rename key newkey //如果key存在 直接覆盖 renamenx key newkey //如果key存在 则失败 返回0 设置一定时

Redis——五种数据类型

Redis共有strings.hashs.lists.sets.sorted sets五种数据类型,可以说已经比较丰富了.下面只对这几种数据类型的数据结构与用途做简要介绍.至于每种数据类型的操作API,这里只简单一提,不再一一详细介绍,有需要的用户可以Google即可. 一.    strings string是最简单的类型,一个Key对应一个Value.string类型是类型安全的,Redis的string可以包含任何数据,比如jpg图片或者序列化的对象.存储结构如下: 常用的API函数有:

redis的五种数据类型

redis的五种数据类型 redis客户端建立 ./redis-cli -h 192.168.1.22 -p 6380 --raw 1.String 应用场景: 统计网站访问数量.当前在线人数.微博数.粉丝数等,全局递增ID等 . 常用命令: SET key value GET key MSET key1 value1 [key2 value2] MGET key1 key2 INCR key DECR key SETNX key value  #只有key 不存在时,才设置key的值 2.Ha

redis五种数据类型的使用场景

string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一段内容 设置及获取字符串的某一位(bit) 批量设置一系列字符串的内容 应用场景: String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String, 也可以是数字:比如想知道什么时候封锁一个IP地址(访问超过几次).INCRBY命令让这些变得很容易,

Java 操作 Redis 五种数据类型

项目添加依赖 <!-- Redis 依赖 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> Java 怎么连接 Redis //连接 Redis @Test public void initConn01(){ S

轻松搞定高并发:详解Redis的五种数据类型及应用场景分析!

一.Redis基本概念介绍和特性 1.1 Redis基本概念介绍 1.Redis是远程的,有客户端和服务端,我们一般说的是服务端: 2.Redis是基于内存的,所以比基于硬盘的MySQL要快很多,但非常吃内存 3.Redis是非关系型数据库.本质上也是数据库,但MySQL关系型数据库存储时必须定义数据词典,而Redis则不需要. 1.2 Redis 和 Memcached比较 Redis数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的

转 redis 五种数据类型的使用场景

http://www.cnblogs.com/lori/archive/2012/05/15/2501862.html Redis学习笔记~Redis提供的五种数据结构 回到目录 分布式缓存,消息队列,替代Session呵呵(Session太不稳定了,呵呵)=Redis Redis的崛起绝非偶然,它确实有自己的新东西在里面,它不像Memcached,只能将数据存储在内存中,它提供了持久化机制,避免了場机后的雪崩的问题,即服务器出现问题后,内存中保留的原始数据全部丢失,需要重新组织数据到内存,这时

redis 五种数据类型

前言 前面学会了单机, 学会了集群, 但是redis咋用啊? 或者说, redis支持哪些数据类型呢? 常用的有五种: String , Hash, List, Set, zset(SortedSet) 一.String String 类型, 在前面也是使用过的. 直接来看一下 可以使用del name来删除缓存 二.List push指令: push分两个, 一个从左边push, 一个从右边push. 但是这个左右, 是对准备push的值而言的. 而不是针对将要push的数组来说的. pop指

《闲扯Redis三》Redis五种数据类型之List型

一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. Redis 中的 list 是我们经常使用到的一种数据类型,根据使用方式的不同,可以应用到很多场景中. 二.操作命令 ?List数据类型在 Redis 中的相关命令:: 命令 描述 用法 LPUSH 1.将一个或多个值value插入到列表key的表头2.如果有多个value值,那么各个value值按