在咱们的项目中,一般会把数据存储到关系型数据库中,好比Oracle,SQL Server,Mysql等,可是关系型数据库对于并发的支持并非很强大,这样就会形成系统的性能不佳,并且存储的数据多为结构化数据,对于非结构数据(好比文本)和半结构化数据(好比JSon) 就显得不够灵活,而非关系型数据库则很好的弥补了这两点, 咱们一般把读操做频繁的数据写入Redis中,以Key-value的方式存储来提升性能。前端
Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。如下介绍了.net中操做redis五种数据类型的基本语法。redis
string 是 redis 最基本的类型,你能够理解成与 Memcached 如出一辙的类型,一个 key 对应一个 value。sql
string 类型是二进制安全的。意思是 redis 的 string 能够包含任何数据。好比jpg图片或者序列化的对象。数据库
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。缓存
存储简单的键值对,好比咱们须要统计某个网站的点击量,关注量、粉丝量等安全
如今须要保存一个Webservice接口的参数,让其实现可配置,好比地址、用户名、密码、同步时间等信息,咱们能够将它在前端页面格式化为JSon字符串,服务器
而后经过Ajax传递到服务端保存到Redis中,代码以下:数据结构
1 /// <summary> 2 /// 保存数据到Redis缓存中 3 /// GHB BY 2020-06-26 4 /// </summary> 5 /// <param name="KeyName">须要保存的键名称,默认保存到redis的第二个数据库中</param> 6 /// <param name="configInfo">须要保存的配置信息</param> 7 /// <returns>返回保存的结果</returns> 8 public string SaveConfigInfoToRedis(string KeyName, string configInfo) 9 { 10 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 11 { 12 if (client == null) return "保存失败!"; 13 if (client.ContainsKey(KeyName)) 14 client.Replace<string>(KeyName, configInfo); 15 else 16 client.Set<string>(KeyName, configInfo); 17 return "保存成功!"; 18 } 19 }
保存成功后,咱们在redis可视化工具中能够看到咱们保存的信息为:并发
若是下次加载数据的时候,咱们能够根据Key来读取这个string字符串,而后格式化为Hashtable,再序列化为JOSN格式返回到前端,就能够以表单的形式展现,dom
在表单中能够修改保存等操做,实现了参数的可配置,这读取代码以下:
1 /// <summary> 2 /// 从redis缓存中获取数据,转化为相应格式后返回 3 /// GHB BY 2020-06-26 4 /// </summary> 5 /// <param name="KeyName">缓存中的键名称</param> 6 /// <returns>输入键对应的值信息</returns> 7 public string LoadConfigFromRedis(string KeyName) 8 { 9 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 10 { 11 if (client == null) return string.Empty; 12 string configData = client.Get<string>(KeyName); 13 if (string.IsNullOrWhiteSpace(configData)) 14 return string.Empty; 15 Hashtable data = JsonConvert.DeserializeObject<Hashtable>(configData); 16 return JsonConvert.SerializeObject(data); 17 18 } 19 }
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
咱们须要灵活的保存一些信息,特别适合保存对象的信息,好比用户信息、配置信息等
因为咱们上面使用string类型的对象保存配置信息存在这样的问题,就是涉及到序列化和反序列化,若是信息量大的话将下降系统性能,
那么此处咱们可使用Hash数据结构来保存上面的信息,代码以下:
1 /// <summary> 2 /// 操做redis的hashtable类型 3 /// GHB BY 2020-06-26 4 /// </summary> 5 public static void OperateHash() 6 { 7 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb",1)) 8 { 9 Dictionary<string, string> configDic = new Dictionary<string, string>(); 10 configDic.Add("config_IP", "localhost"); 11 configDic.Add("config_Port", "1521"); 12 configDic.Add("config_serviceName", "orcl"); 13 configDic.Add("config_userName", "DE_POWERPMS"); 14 configDic.Add("config_password", "cppepass"); 15 client.SetRangeInHash("config_info", configDic); 16 Dictionary<string, string> testHash = client.GetAllEntriesFromHash("config_info"); 17 foreach (var item in testHash) 18 { 19 Console.WriteLine("Hash的key为:{0} 值为:{1}", item.Key, item.Value); 20 } 21 Console.ReadLine(); 22 } 23 }
使用redis可视化工具咱们能够刚才存储的数据以下:
Redis 列表是简单的字符串列表,按照插入顺序排序。你能够添加一个元素到列表的头部(左边)或者尾部(右边),可使用list的push操做将任务存到List,
而后使用pop操做将任务取出执行,在列表头部或者末尾操做数据很是高效,不受队列长度的影响。
列表最多可存储 232 - 1 元素 (4294967295, 每一个列表可存储40多亿)。
redis 的 list 数据类型对于大部分使用者来讲,是实现队列服务的最经济,最简单的方式。
另外,由于 list 结构的数据查询两端附近的数据性能很是好,因此适合一些须要获取最新数据的场景,好比新闻类应用的 “最近新闻”,获取钱N个用户列表等。
对于队列的使用,在此处好比有多个客户端须要打印机打印任务,那么使用队列进行任务的排队,而后按照排队顺序开始打印
对于栈的使用,好比二叉树的遍历,括号的匹配等,咱们能够进行先进后出的顺序完成,代码以下:
1 /// <summary> 2 /// 操做redis的List类型 3 /// GHB BY 2020-06-26 4 /// </summary> 5 public static void OperateList() 6 { 7 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 8 { 9 #region List队列操做 10 client.EnqueueItemOnList("QueueList", "打印任务1"); //入队 11 client.EnqueueItemOnList("QueueList", "打印任务2"); 12 client.EnqueueItemOnList("QueueList", "打印任务3"); 13 client.EnqueueItemOnList("QueueList", "打印任务4"); 14 long q = client.GetListCount("QueueList"); 15 Console.WriteLine("打印任务按照顺序打印开始"); 16 for (int i = 0; i < q; i++) 17 { 18 Console.WriteLine("QueueList出队值:{0}", client.DequeueItemFromList("QueueList")); 19 } 20 Console.WriteLine("打印任务按照顺序打印完成"); 21 #endregion 22 #region 栈操做 23 client.PushItemToList("StackList", "入栈操做1"); //入栈 24 client.PushItemToList("StackList", "入栈操做2"); 25 client.PushItemToList("StackList", "入栈操做3"); 26 client.PushItemToList("StackList", "入栈操做4"); 27 Console.WriteLine("开始出栈"); 28 long p = client.GetListCount("StackList"); 29 for (int i = 0; i < p; i++) 30 { 31 Console.WriteLine("StackList出栈值:{0}", client.PopItemFromList("StackList")); 32 } 33 Console.WriteLine("出栈完成"); 34 Console.ReadLine(); 35 #endregion 36 } 37 }
运行结果显示,队列是先进先出操做,栈是先进后出操做,而且操做完成后,数据被删除,如图所示:
Redis 的 Set 是 string 类型的无序集合。
集合是经过哈希表实现的,因此添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1(4294967295, 每一个集合可存储40多亿个成员)。
Redis zset 和 set 同样也是string类型元素的集合,且不容许重复的成员。
集合主要应用在一些须要求交集、并集、补集这样的场景,好比咱们须要求共同好友、共同兴趣爱好、共同关注的微博,限制同一个帐号多处登陆系统等场景。
好比如今随便举例两个QQ用户为例:QQ用户1和QQ用户2,他们分别有各自的好友,如今咱们能够经过集合来获取到他们的共同好友,代码以下:
1 /// <summary> 2 /// 操做redis的Set类型 3 /// GHB BY 2020-06-26 4 /// </summary> 5 public static void OperateSet() 6 { 7 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 8 { 9 #region Set操做 10 client.AddItemToSet("QQ用户1", "好友A"); 11 client.AddItemToSet("QQ用户1", "好友B"); 12 client.AddItemToSet("QQ用户1", "好友C"); 13 client.AddItemToSet("QQ用户1", "好友D"); 14 15 client.AddItemToSet("QQ用户2", "好友C"); 16 client.AddItemToSet("QQ用户2", "好友F"); 17 client.AddItemToSet("QQ用户2", "好友G"); 18 client.AddItemToSet("QQ用户2", "好友D"); 19 var setunion = client.GetIntersectFromSets("QQ用户1", "QQ用户2"); 20 Console.WriteLine("QQ用户1和QQ用户2的共同好友为:"); 21 foreach (var item in setunion) 22 { 23 Console.WriteLine(item); 24 } 25 Console.ReadLine(); 26 #endregion 27 } 28 }
运行结果显示他们的共同好友为: 好友C和好友D
在 set 的基础上给集合中每一个元素关联了一个分数,往有序集合中插入数据时会自动根据这个分数排序。不一样的是每一个元素都会关联一个double类型的分数。
redis正是经过分数来为集合中的成员进行从小到大的排序。
zset的成员是惟一的,但分数(score)却能够重复。
在集合类型的场景上加入排序就是有序集合的应用场景了。好比根据好友的“亲密度”排序显示好友列表。
好比如今有不少主播,每一个主播都有粉丝给的礼物,如今须要咱们给出礼物数量最多的前三名主播,那么可使用SortedSet来实现,
能够分别给每一个主播定义个分数来存储礼物数量,代码以下:
1 /// <summary> 2 /// 操做redis的SortedSet类型 3 /// GHB BY 2020-06-26 4 /// </summary> 5 public static void OperateSortedSet() 6 { 7 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 8 { 9 #region Set操做 10 client.AddItemToSortedSet("GiftSortedSet", "主播1", 24); 11 client.AddItemToSortedSet("GiftSortedSet", "主播2", 564); 12 client.AddItemToSortedSet("GiftSortedSet", "主播3", 746); 13 client.AddItemToSortedSet("GiftSortedSet", "主播4", 2357); 14 client.IncrementItemInSortedSet("GiftSortedSet", "主播2", new Random().Next(200, 500)); 15 Console.WriteLine("礼物数最多的前三名主播为:"); 16 foreach (var item in client.GetRangeWithScoresFromSortedSet("GiftSortedSet",1,3)) 17 { 18 Console.WriteLine($"名:{item.Key} 分数:{item.Value}"); 19 } 20 Console.ReadLine(); 21 #endregion 22 } 23 }
运行以后,咱们能够看到礼物数前三名的主播了,运行结果以下:
以上就是.NET环境下操做Redis五种数据类型的全部方法总结,咱们能够看到Redis更是一款数据结构服务器,对于这五种数据类型,咱们能够实现不少操做,
好比对字符串进行附加操做;递增哈希中的值;向列表中增长元素;计算集合的交集、并集与差集;使用排序集合来获取排名等。
好了,今天的技术分享就到这儿了,若是你们有兴趣,能够共同探讨,QQ:2358643757