Skip to content

ZSet类型相关命令

ZSet和Set类似,不允许重复的成员(member),不同的是ZSet每个元素都会关联一个double类型的分数,分数 (score) 却可以重复, 按照分数以递增的方式进行排序。但是不同成员间有可能有相同的分数。当多个成员有相同的分数时,他们将是按字典排序(字典排序用的是二进制,它比较的是字符串的字节数组)。

1. ZADD命令

语法: ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
用于将一个或多个member元素及其score值加入到有序集key当中,其中score值用来排序。如果某个member已经是有序集的成员,那么更新这个memberscore值,并通过重新插入这个member元素,来保证该member在正确的位置上。如果有序集合key不存在,则创建一个空的有序集并执行ZADD操作。当key存在但不是有序集类型时,返回一个错误。score值可以是整数值或双精度浮点数,score可为正也可以为负。
其中参数:

  • XX: 仅更新存在的成员,不添加新成员。
  • NX: 不更新存在的成员。只添加新成员。
  • LT: 更新新的分值比当前分值小的成员,不存在则新增。
  • GT: 更新新的分值比当前分值大的成员,不存在则新增。
  • CH: 返回变更成员的数量。变更的成员是指新增成员score值更新的成员,命令指明的和之前score值相同的成员不计在内。在通常情况下,ZADD返回值只计算新添加成员的数量
  • INCR: 使用该参数与ZINCRBY功能一样。一次只能操作一个score-element对。

警告

GT,LTNX 三者互斥不能同时使用。

sh
127.0.0.1:6379> zadd zset1 1 60 2 30 4 50 3 80 -1 10
(integer) 5
127.0.0.1:6379> zrange zset1 0 -1
1) "10"
2) "60"
3) "30"
4) "80"
5) "50"
## 虽然80没有添加进去,但是80的score被覆盖了
127.0.0.1:6379> zadd zset1 5 80
(integer) 0
127.0.0.1:6379> zscore zset1 80
"5"
## 继续增加80的分数
127.0.0.1:6379> zadd zset1 incr 2  80
"7"
## 元素不存在,默认分数就是0
127.0.0.1:6379> zadd zset1 incr 2  110
"2"
127.0.0.1:6379> zrange zset1 0 -1
1) "10"
2) "110"
3) "30"
4) "50"
5) "60"
6) "100"
7) "80"

2. ZRANGE命令

语法: ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
返回有序集中,指定区间内的成员,其中成员的按分数值递增来排序,具有相同分数值的成员按字典序来排列。下标参数startstop都大于等于0,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。你也可以使用负数下标,以 -1表示最后一个成员, -2表示倒数第二个成员,以此类推。超出范围的索引不会产生错误。如果start参数的值大于有序集合中的最大索引,或者start >stop ,将会返回一个空列表。如果stop的值大于有序集合的末尾,Redis会将其视为有序集合的最后一个元素。 其中参数:

  • BYSCORE: 获取分数介于startstop之间(包括等于startstop)的成员,此时startstop用分数表示,若需要不包含startstop, 可以配合()使用,如(start表示不包含start, 如需获取所有成员,但是不知道有序集的最低和最高score值, 可以使用-inf(表示集合中最小分数) 和+inf(表示集合中最大分数)分别作为startstop
  • BYLEX: 按照字典排序获取集合,此时startstop用字典值(任意字符串,在Redis中会转化成ASCII字符串和集合中元素进行比较)表示, startstop需要使用([开头指明是否包含字典值,其中[表示包含字典值,(表示不包含,若要获取所有成员,需要使用startstop的特殊值:+-分别表示正无限和负无限字符串。
  • REV: 反转排序集,将索引0作为得分最高的元素最后输出。
  • LIMIT: 类似SQL中的分页,用于从匹配元素中获取子范围集合,如果count为负数,将返回offset之后的所有元素。
  • WITHSCORES: 表示将元素与分数一起返回。 应用场景: 商品列表排序, 主播打赏排行榜
sh
## withscores选项是先元素再分数输出
127.0.0.1:6379> zrange zset1 0 -1 withscores
 1) "10"
 2) "-1"
 3) "60"
 4) "1"
 5) "30"
 6) "2"
 7) "80"
 8) "3"
 9) "50"
10) "4"
11) "100"
12) "5"
127.0.0.1:6379> zrange zset1 -1 2 byscore
1) "10"
2) "60"
3) "30"
127.0.0.1:6379> zrange zset1 -inf +inf byscore
1) "10"
2) "60"
3) "30"
4) "80"
5) "50"
6) "100"
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
127.0.0.1:6379> zrange myzset (a [c bylex
1) "b"
2) "c"

3. ZREVRANGE命令(已过时)

语法: ZREVRANGE key start stop [WITHSCORES]
返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从高到低)来排列。 自Redis 6.2.0之后被置为过时,用ZRANGE命令配合REV参数作用等效。

sh
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
 1) "100"
 2) "5"
 3) "50"
 4) "4"
 5) "80"
 6) "3"
 7) "30"
 8) "2"
 9) "60"
10) "1"
11) "10"
12) "-1"

4. ZRANGEBYSCORE命令(已过时)

语法: ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回有序集key中,所有score值介于minmax之间(包括等于minmax)的成员。有序集成员按 score 值递增(从小到大)次序排列。具有相同score值的成员按字典序来排列。自Redis 6.2.0之后被置为过时,用ZRANGE命令配合BYSCORE参数作用等效。

  • LIMIT: 参数指定返回结果的数量及区间(就像SQL中的分页功能),注意当offset很大时,定位offset的操作可能需要遍历整个有序集。
  • WITHSCORES: 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其score值一起返回。
sh
127.0.0.1:6379> zrangebyscore zset1 -inf +inf limit 0 5
1) "10"
2) "60"
3) "30"
4) "80"
5) "50"

5. ZSCORE命令

语法: ZSCORE key member
返回有序集key中成员member的分数。如果有序集中不存在member,或者key不存在,返回nil 。

sh
127.0.0.1:6379> zscore zset1 100
"5"
127.0.0.1:6379> zscore zset1 1000
(nil)

6. ZCARD命令

语法: ZCARD key
用于返回有序集的成员个数,当key不存在时,返回0。

sh
127.0.0.1:6379> zcard zset
(integer) 0
127.0.0.1:6379> zcard zset1
(integer) 6

7. ZREM命令

语法: ZREM key member [member ...]
用于从有序集合key中删除指定的成员member。如果member不存在则被忽略。当key存在,但是不是有序集合类型时,返回类型错误。

sh
127.0.0.1:6379> zrem zset1 110
(integer) 1
127.0.0.1:6379> zrange zset1 0 -1
1) "10"
2) "30"
3) "50"
4) "60"
5) "100"
6) "80"

8. ZINCRBY命令

语法: ZINCRBY key increment member
用于增加某个元素的分数,其中增量为increment 。当key不存在,或member不是key的成员时, ZINCRBY key increment member等同于ZADD key increment member 。当key不是有序集类型时,返回ERR WRONGTYPE Operation against a key holding the wrong kind of valuescore值可以是字符串形式表示的整数值或双精度浮点数。
可以通过传递一个负数值increment,让score减去相应的值,比如ZINCRBY key -2 member,就是让memberscore值减去2 。

sh
127.0.0.1:6379> zincrby zset1 3 60
"4"
127.0.0.1:6379> zscore zset1 60
"4"

9. ZCOUNT命令

语法: ZCOUNT key min max
返回有序集key中,score值在minmax之间(默认包括score值等于minmax)的成员的数量。

sh
127.0.0.1:6379> zcount zset1 -1 3
(integer) 2
127.0.0.1:6379> zcount zset1 (-1 3
(integer) 1
127.0.0.1:6379> zcount zset1 (-1 +inf
(integer) 5

10. ZMPOP命令

语法: ZMPOP numkeys key [key ...] <MIN | MAX> [COUNT count]
从提供的键名列表中的第一个非空排序集中弹出一个或多个成员对(分数元素)。其中numkeys指的是列表的个数。 参数说明:

  • MIN: 从第一个非空列表中弹出分数最小的元素。
  • MAX: 从第一个非空列表中弹出分数最大的元素。
  • COUNT: 弹出指定数量的元素,默认为1,如果超过列表的大小,将弹出所有元素。
sh
127.0.0.1:6379> zmpop 2 zset1 zset2 min count 2
1) "zset1"
2) 1) 1) "50"
      2) "4"
   2) 1) "60"
      2) "4"
127.0.0.1:6379> zcard zset1
(integer) 0
## 如果zset1为空,第一个非空列表将变为zset2
127.0.0.1:6379> zmpop 2 zset1 zset2 min count 2
1) "zset2"
2) 1) 1) "10"
      2) "1"
   2) 1) "20"
      2) "2"

11. ZRANK命令

语法: ZRANK key member [WITHSCORE]
返回有序集key中成员member的排名,其中有序集成员按score值从低到高排列。排名从0开始,也就是说,score值最低的成员排名为0。如果member不是有序集key的成员或key不存在,将返回nil。

sh
127.0.0.1:6379> zrank zset2 40
(integer) 1

12. ZREVRANK命令

语法: ZREVRANK key member [WITHSCORE]
有序集key中成员member的排名,其中有序集成员按score值从高到低排列。排名从0开始,也就是说,score值最大的成员排名为0。如果member不是有序集key的成员或key不存在,将返回nil。和ZRANK作用相反。

sh
127.0.0.1:6379> zrevrank zset2 40
(integer) 0