ZSet类型的解释说明
ZSet集合和Set集合类型类似,只是在set的基础上,增加了一个score排序分值;
特性:
- sorted set,有序集合
- 元素为string类型 元素具有唯⼀性,不重复
- 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
- 说明:没有修改操作(但可以覆盖)
补充
Redis有5种基础数据结构,分别是:
string(字符串)
list(列表)
hash(字典)
set(集合)
zset(有序集合)(这个排序的功能是通过Skip List(跳跃列表)来实现的。)
其中list、set、hash、zset这四种数据结构是容器型数据结构,它们共享下面两条通用规则:
create if not exists:容器不存在则创建
drop if no elements:如果容器中没有元素,则立即删除容器,释放内存(zset(有序集合)的最后一个元素value被移除后,数据结构被自动删除,内存被回收。)
实际场景举例:
- 存储粉丝列表,value是粉丝的ID,score是关注时间戳,这样可以对粉丝关注进行排序
- 存储学生成绩,value使学生的ID,score是学生的成绩,这样可以对学生的成绩排名
zset(有序集合)相关指令
1、zadd -> 向集合中添加元素,集合不存在则新建,key代表zset集合名称,score代表元素的权重,member代表元素
127.0.0.1:6379> zadd name 10 zhangsan
(integer) 1
127.0.0.1:6379> zadd name 11 lisi
(integer) 1
127.0.0.1:6379> zadd name 10.2 wangwu
(integer) 1
2、zrange -> 按照score权重从小到大排序输出集合中的元素,权重相同则按照value的字典顺序排序([lexicographical order])
zrange key start stop
- 返回指定范围内的元素
- start、stop为元素的下标索引
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
获取所有元素,按照score的升序输出
127.0.0.1:6379> zrange name 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
输出权重
127.0.0.1:6379> zrange name 0 -1 WITHSCORES
1) "lisi"
2) "7"
3) "zhangsan"
4) "9"
5) "wangwu"
6) "10.199999999999999"
3、zrevrange -> 按照score权重从大到小输出集合中的元素,权重相同则按照value的字典逆序排序
zrevrange name 0 -1 WITHSCORES
127.0.0.1:6379> zrevrange name 0 -1 WITHSCORES
1) "wangwu"
2) "10.199999999999999"
3) "zhangsan"
4) "9"
5) "lisi"
6) "7"
4、zcard -> 当 key 存在且是有序集类型时,返回有序集的基数(简单理解为个数)。 当 key 不存在时,返回 0
127.0.0.1:6379> zcard name
(integer) 3
127.0.0.1:6379>
5、zscore -> 返回有序集 key 中,成员 member 的 score 值,如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil
127.0.0.1:6379> ZSCORE name lisi
"7"
127.0.0.1:6379>
127.0.0.1:6379> ZSCORE name wangwu
"10.199999999999999"
127.0.0.1:6379>
6、zrangebyscore -> 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
127.0.0.1:6379> zrangebyscore name 9 10
1) "zhangsan"
127.0.0.1:6379> zrangebyscore name 9 10 WITHSCORES
1) "zhangsan"
2) "9"
127.0.0.1:6379>
7、zrem -> 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略
127.0.0.1:6379> zrem name wangwu
(integer) 1
127.0.0.1:6379> ZSCORE name wangwu
(nil)
127.0.0.1:6379>
删除权重在指定范围的元素
zremrangebyscore key min max
8、覆盖操作(可以简单的理解为修改操作)
127.0.0.1:6379> zadd name 7.8 mazi
(integer) 1
127.0.0.1:6379> zadd name 3 zhouliu
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> zrange name 0 -1 WITHSCORES
1) "zhouliu"
2) "3"
3) "lisi"
4) "7"
5) "mazi"
6) "7.7999999999999998"
7) "zhangsan"
8) "8"
127.0.0.1:6379> zadd name 10 mazi
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> zrange name 0 -1 WITHSCORES
1) "zhouliu"
2) "3"
3) "lisi"
4) "7"
5) "zhangsan"
6) "8"
7) "mazi"
8) "10"
127.0.0.1:6379>
观察顺序
- 在score一样的时候,默认 则按照value字典排序输出
127.0.0.1:6379> zadd name 3 haozi
(integer) 1
127.0.0.1:6379> zrange name 0 -1 WITHSCORES
1) "haozi"
2) "3"
3) "zhouliu"
4) "3"
5) "lisi"
6) "7"
7) "zhangsan"
8) "8"
9) "mazi"
10) "10"
127.0.0.1:6379> zadd name 3 xiaomei
(integer) 1
127.0.0.1:6379> zrange name 0 -1 WITHSCORES
1) "haozi"
2) "3"
3) "xiaomei"
4) "3"
5) "zhouliu"
6) "3"
7) "lisi"
8) "7"
9) "zhangsan"
10) "8"
11) "mazi"
12) "10"
127.0.0.1:6379>
其实到这里有个问题,上面我zadd进去的是7.8 但是实际却是 7.7999999999999998
本篇文章不再做详细研究,后面可以另行开启文章解读。
这里推荐一篇概念性文章,大致浏览感觉还不错:
https://blog.csdn.net/weixin_39637979/article/details/111135878
版权声明:本文为qq_34129814原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。