c#操作Redis的5种基本类型汇总(转载)
前言
在我们的项目中,通常会把数据存储到关系型数据库中,比如Oracle,SQL Server,Mysql等,但是关系型数据库对于并发的支持并不是很强大,这样就会造成系统的性能不佳,而且存储的数据多为结构化数据,对于非结构数据(比如文本)和半结构化数据(比如JSon) 就显得不够灵活,而非关系型数据库则很好的弥补了这两点, 我们通常把读操作频繁的数据写入Redis中,以Key-value的方式存储来提高性能。
Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。以下介绍了.net中操作redis五种数据类型的基本语法。
一、String数据类型的应用场景
1. 简介
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
2.使用场景
存储简单的键值对,比如我们需要统计某个网站的点击量,关注量、粉丝量等
3. C#使用操作举例
现在需要保存一个Webservice接口的参数,让其实现可配置,比如地址、用户名、密码、同步时间等信息,我们可以将它在前端页面格式化为JSon字符串,
然后通过Ajax传递到服务端保存到Redis中,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/// <summary> /// 保存数据到Redis缓存中 /// GHB BY 2020-06-26 /// </summary> /// <param name="KeyName">需要保存的键名称,默认保存到redis的第二个数据库中</param> /// <param name="configInfo">需要保存的配置信息</param> /// <returns>返回保存的结果</returns> public string SaveConfigInfoToRedis( string KeyName, string configInfo) { using (RedisClient client = new RedisClient( "127.0.0.1" , 6379, "qd*jy*17ghb" , 1)) { if (client == null ) return "保存失败!" ; if (client.ContainsKey(KeyName)) client.Replace< string >(KeyName, configInfo); else client.Set< string >(KeyName, configInfo); return "保存成功!" ; } } |
保存成功后,我们在redis可视化工具中可以看到我们保存的信息为:
如果下次加载数据的时候,我们可以根据Key来读取这个string字符串,然后格式化为Hashtable,再序列化为JOSN格式返回到前端,就可以以表单的形式展示,
在表单中可以修改保存等操作,实现了参数的可配置,这读取代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/// <summary> /// 从redis缓存中获取数据,转化为相应格式后返回 /// GHB BY 2020-06-26 /// </summary> /// <param name="KeyName">缓存中的键名称</param> /// <returns>输入键对应的值信息</returns> public string LoadConfigFromRedis( string KeyName) { using (RedisClient client = new RedisClient( "127.0.0.1" , 6379, "qd*jy*17ghb" , 1)) { if (client == null ) return string .Empty; string configData = client.Get< string >(KeyName); if ( string .IsNullOrWhiteSpace(configData)) return string .Empty; Hashtable data = JsonConvert.DeserializeObject<Hashtable>(configData); return JsonConvert.SerializeObject(data); } } |
二、hash(哈希)
1.简介
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
2.使用场景
我们需要灵活的保存一些信息,特别适合保存对象的信息,比如用户信息、配置信息等
3.C#使用操作举例
由于我们上面使用string类型的对象保存配置信息存在这样的问题,就是涉及到序列化和反序列化,如果信息量大的话将降低系统性能,
那么此处我们可以使用Hash数据结构来保存上面的信息,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/// <summary> /// 操作redis的hashtable类型 /// GHB BY 2020-06-26 /// </summary> public static void OperateHash() { using (RedisClient client = new RedisClient( "127.0.0.1" , 6379, "qd*jy*17ghb" ,1)) { Dictionary< string , string > configDic = new Dictionary< string , string >(); configDic.Add( "config_IP" , "localhost" ); configDic.Add( "config_Port" , "1521" ); configDic.Add( "config_serviceName" , "orcl" ); configDic.Add( "config_userName" , "DE_POWERPMS" ); configDic.Add( "config_password" , "cppepass" ); client.SetRangeInHash( "config_info" , configDic); Dictionary< string , string > testHash = client.GetAllEntriesFromHash( "config_info" ); foreach (var item in testHash) { Console.WriteLine( "Hash的key为:{0} 值为:{1}" , item.Key, item.Value); } Console.ReadLine(); } } |
使用redis可视化工具我们可以刚才存储的数据如下:
三、List(列表)
1.简介
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),可以使用list的push操作将任务存到List,
然后使用pop操作将任务取出执行,在列表头部或者末尾操作数据非常高效,不受队列长度的影响。
列表最多可存储 232- 1 元素 (4294967295, 每个列表可存储40多亿)。
2.使用场景
redis 的 list 数据类型对于大部分使用者来说,是实现队列服务的最经济,最简单的方式。
另外,因为 list 结构的数据查询两端附近的数据性能非常好,所以适合一些需要获取最新数据的场景,比如新闻类应用的 “最近新闻”,获取钱N个用户列表等。
3.C#使用操作举例
对于队列的使用,在此处比如有多个客户端需要打印机打印任务,那么使用队列进行任务的排队,然后按照排队顺序开始打印
对于栈的使用,比如二叉树的遍历,括号的匹配等,我们可以进行先进后出的顺序完成,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
/// <summary> /// 操作redis的List类型 /// GHB BY 2020-06-26 /// </summary> public static void OperateList() { using (RedisClient client = new RedisClient( "127.0.0.1" , 6379, "qd*jy*17ghb" , 1)) { #region List队列操作 client.EnqueueItemOnList( "QueueList" , "打印任务1" ); //入队 client.EnqueueItemOnList( "QueueList" , "打印任务2" ); client.EnqueueItemOnList( "QueueList" , "打印任务3" ); client.EnqueueItemOnList( "QueueList" , "打印任务4" ); long q = client.GetListCount( "QueueList" ); Console.WriteLine( "打印任务按照顺序打印开始" ); for ( int i = 0; i < q; i++) { Console.WriteLine( "QueueList出队值:{0}" , client.DequeueItemFromList( "QueueList" )); } Console.WriteLine( "打印任务按照顺序打印完成" ); #endregion #region 栈操作 client.PushItemToList( "StackList" , "入栈操作1" ); //入栈 client.PushItemToList( "StackList" , "入栈操作2" ); client.PushItemToList( "StackList" , "入栈操作3" ); client.PushItemToList( "StackList" , "入栈操作4" ); Console.WriteLine( "开始出栈" ); long p = client.GetListCount( "StackList" ); for ( int i = 0; i < p; i++) { Console.WriteLine( "StackList出栈值:{0}" , client.PopItemFromList( "StackList" )); } Console.WriteLine( "出栈完成" ); Console.ReadLine(); #endregion } } |
运行结果显示,队列是先进先出操作,栈是先进后出操作,并且操作完成后,数据被删除,如图所示:
四.Set(集合)
1.简介
Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232- 1(4294967295, 每个集合可存储40多亿个成员)。
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
2.使用场景
集合主要应用在一些需要求交集、并集、补集这样的场景,比如我们需要求共同好友、共同兴趣爱好、共同关注的微博,限制同一个账号多处登录系统等场景。
3.C#使用操作举例
比如现在随便举例两个QQ用户为例:QQ用户1和QQ用户2,他们分别有各自的好友,现在我们可以通过集合来获取到他们的共同好友,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/// <summary> /// 操作redis的Set类型 /// GHB BY 2020-06-26 /// </summary> public static void OperateSet() { using (RedisClient client = new RedisClient( "127.0.0.1" , 6379, "qd*jy*17ghb" , 1)) { #region Set操作 client.AddItemToSet( "QQ用户1" , "好友A" ); client.AddItemToSet( "QQ用户1" , "好友B" ); client.AddItemToSet( "QQ用户1" , "好友C" ); client.AddItemToSet( "QQ用户1" , "好友D" ); client.AddItemToSet( "QQ用户2" , "好友C" ); client.AddItemToSet( "QQ用户2" , "好友F" ); client.AddItemToSet( "QQ用户2" , "好友G" ); client.AddItemToSet( "QQ用户2" , "好友D" ); var setunion = client.GetIntersectFromSets( "QQ用户1" , "QQ用户2" ); Console.WriteLine( "QQ用户1和QQ用户2的共同好友为:" ); foreach (var item in setunion) { Console.WriteLine(item); } Console.ReadLine(); #endregion } } |
运行结果显示他们的共同好友为: 好友C和好友D
五、zset(sorted set:有序集合)
1.简介
在 set 的基础上给集合中每个元素关联了一个分数,往有序集合中插入数据时会自动根据这个分数排序。不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
2.使用场景
在集合类型的场景上加入排序就是有序集合的应用场景了。比如根据好友的“亲密度”排序显示好友列表。
3.C#使用操作举例
比如现在有很多主播,每个主播都有粉丝给的礼物,现在需要我们给出礼物数量最多的前三名主播,那么可以使用SortedSet来实现,
可以分别给每个主播定义个分数来存储礼物数量,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/// <summary> /// 操作redis的SortedSet类型 /// GHB BY 2020-06-26 /// </summary> public static void OperateSortedSet() { using (RedisClient client = new RedisClient( "127.0.0.1" , 6379, "qd*jy*17ghb" , 1)) { #region Set操作 client.AddItemToSortedSet( "GiftSortedSet" , "主播1" , 24); client.AddItemToSortedSet( "GiftSortedSet" , "主播2" , 564); client.AddItemToSortedSet( "GiftSortedSet" , "主播3" , 746); client.AddItemToSortedSet( "GiftSortedSet" , "主播4" , 2357); client.IncrementItemInSortedSet( "GiftSortedSet" , "主播2" , new Random().Next(200, 500)); Console.WriteLine( "礼物数最多的前三名主播为:" ); foreach (var item in client.GetRangeWithScoresFromSortedSet( "GiftSortedSet" ,1,3)) { Console.WriteLine($ "名:{item.Key} 分数:{item.Value}" ); } Console.ReadLine(); #endregion } } |
运行之后,我们可以看到礼物数前三名的主播了,运行结果如下:
总结
以上就是.NET环境下操作Redis五种数据类型的所有方法总结,我们可以看到Redis更是一款数据结构服务器,对于这五种数据类型,我们可以实现很多操作,
比如对字符串进行附加操作;递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集;使用排序集合来获取排名等。
转载:https://www.jb51.net/article/190137.htm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律