Redis 数据类型
字符串(String)、列表(List)、集合(Set)、有序集合(SortedSet)、哈希表(Hash)
String 字符串
-
说明
- 字符串,string类型是二进制安全的,所以redis的string 可以包含任何数据,比如jpg图片、序列化的对象
-
业务场景:
- 缓存数据、计数器、配置信息、存储简单的键值对数据等
-
示例
#region 普通--字符串---Text { var key = "string:" + id; var value = Guid.NewGuid().ToString().Replace("-", ""); //Text设置:------------------------------------------------------ var isOk = _redis.StringSet(key, value); //Text读取:------------------------------------------------------ var redisValue = _redis.StringGet(key); }
#region model--对象---json { var key = "model:" + id; var user = new UserEntity { Id = id, Name = "张三" }; //设置:------------------------------------------------------ var isOk = _redis.StringSet(key, user); //读取:------------------------------------------------------ var value = _redis.StringGet<UserEntity>(key); } #endregion
#region list-对象集合--json { var key = "json:" + id; var gridList = GetList(); //设置:------------------------------------------------------ var isOk = _redis.StringSet(key, gridList); //读取:------------------------------------------------------ var value = _redis.StringGet<List<UserEntity>>(key); } #endregion
Hash 哈希表
-
说明
- 散列,相当于 HashMap
- 是一个string类型的 field 和 value 的映射表
- 适合存储一些结构化的数据,如登录用户信息
-
优点
- 支持部分更新
- 快速查询指定字段的值
- 可以使用 Redis 的 Hash 类型来存储数据,支持多种操作和查询
-
一个示例(用户信息)
/* 用户信息对象 类型选择,json格式还是Hash: json: 1、对象需要转换json格式,增加存储空间和序列化和反序列化的时间开销 2、不支持部分更新,每次更新需要将整个对象重新写入 Redis。 Hash: 1、支持部分更新 2、快速查询指定字段的值 3、可以使用 Redis 的 Hash 类型来存储数据,支持多种操作和查询 */ List<KeyValueEntity> kvList = new List<KeyValueEntity>(); var user = new UserEntity { Id = id, Name = "张三" }; //Hash设置:将用户信息对象存储到 Redis 中 var key = $"Hash:{user.Id}"; _redis.HashSet(key, "Id", user.Id); _redis.HashSet(key, "Name", user.Name); _redis.HashSet(key, "Description", user.Description); _redis.HashSet(key, "CreateTime", user.CreateTime); //Hash读取:------------------------------------------------------ //第一种方式 var redisValue = new UserEntity(); redisValue.Id = _redis.HashGet<int>(key, "Id"); redisValue.Name = _redis.HashGet(key, "Name"); redisValue.Description = _redis.HashGet(key, "Description"); redisValue.CreateTime = _redis.HashGet<DateTime>(key, "CreateTime"); //第二种方式 var kvEntity = _redis.HashGetAll(key);
List 列表
-
说明
- 列表,相当于LinkedList
- 底层是通过链表来实现的,所以对于list来说首尾添加、删除 操作很快,但索引定位非常慢
- 可以利用它来实现一个栈、队列
-
业务场景:
- 消息队列、最新消息列表、事件记录等
-
示例
var userInfo = GetAUserInfo(id); //设置:------------------------------------------------------ var length = _redis.ListLPush(key, userInfo);//顶部插入 var length2 = _redis.ListRPush(key, userInfo);//尾部插入 //_redis.ListLPop<dynamic>(key);//移除 第一个 //_redis.ListRPop<dynamic>(key);//移除 最后一个 //读取:------------------------------------------------------ var value = _redis.ListGetAll<UserEntity>(key);//获取所有数据
Set 集合
-
说明
- 无序集合,不可重复,相当于 HashSet
-
业务场景
- 唯一值存储、文章标签(求交集)、会员在线状态
-
示例
//添加标签(唯一值): _redis.SetAdd("article:tags:1", "C#", ".net", ".net core", "wpf", "技术", "程序员", "程序员", "程序员"); // 给文章Id=1,增加标签 _redis.SetAdd("article:tags:2", "前端", "vue", "js", "html", "技术", "程序员", "html", "html"); // 给文章Id=2,增加标签 //返回集合中所有的数据: var tags = _redis.SetGetMembers<string>("article:tags:1"); // 获取文章(id=1),中所有标签 //集合求交集(共用的): var articleIds = _redis.SetGetInter<string>("article:tags:1", "article:tags:2"); // 2篇文章 共用的标签 //删除数据: _redis.SetRemove("article:tags:1", "程序员"); // 从文章ID为1的文章中移除标签"coding" var delCount = _redis.Del("article:tags:1"); //删除整个key中的成员 //获取数据数量: long tagCount = _redis.SetGetMemberCount("article:tags:1"); // 获取文章(id=1),中所有标签数量
Zset 有序集合
-
说明
- 有序集合,不可重复
- 不是先添加的在前面,后添加的在后面
- 每个元素都会关联一个double类型的分数,通过分数来为集合中的成员进行从小到大排序
-
业务场景
- 示例
//文章的阅读量排行榜 string key = "article:rank"; //修改指定文章的阅读量 _redis.SortedSetAdd(key, articleId, score); // 指定文章阅读量 递增 _redis.SortedSetIncrBy(key, articleId, increment: 1); //分数从低到高 var zRange1 = _redis.SortedSetGetMemberList<object>(key, 0); //获取所有的成员 var zRange2 = _redis.SortedSetGetMemberList<object>(key, 0, 100); //获取前100个的成员 //分数从高到低 var zRevRange1 = _redis.SortedSetGetMemberList<string>(key, 1, 0); // #stop=-1返回全部 var zRevRange2 = _redis.SortedSetGetMemberList<string>(key, 1, 100); //获取前N个的成员 // 获取有序集合的成员数量 long number = _redis.SortedSetGetMemberCount(key); // 将成员列表转换为字典 var leaderboard = _redis.SortedSetGetList(key, 1, 100).ToList(); // 移除有序集合中一个或多个成员 _redis.SortedSetRemove(key, 1);