高级程序员必须精通的Redis——zset(有序集合)

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版权协议,转载请附上原文出处链接和本声明。