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
已经是有序集的成员,那么更新这个member
的score
值,并通过重新插入这个member
元素,来保证该member
在正确的位置上。如果有序集合key不存在,则创建一个空的有序集并执行ZADD
操作。当key存在但不是有序集类型时,返回一个错误。score
值可以是整数值或双精度浮点数,score
可为正也可以为负。
其中参数:
XX
: 仅更新存在的成员,不添加新成员。NX
: 不更新存在的成员。只添加新成员。LT
: 更新新的分值比当前分值小的成员,不存在则新增。GT
: 更新新的分值比当前分值大的成员,不存在则新增。CH
: 返回变更成员的数量。变更的成员是指新增成员和score值更新的成员,命令指明的和之前score值相同的成员不计在内。在通常情况下,ZADD返回值只计算新添加成员的数量。INCR
: 使用该参数与ZINCRBY
功能一样。一次只能操作一个score-element对。
警告
GT
,LT
和 NX
三者互斥不能同时使用。
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]
返回有序集中,指定区间内的成员,其中成员的按分数值递增来排序,具有相同分数值的成员按字典序来排列。下标参数start
和 stop
都大于等于0,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。你也可以使用负数下标,以 -1表示最后一个成员, -2表示倒数第二个成员,以此类推。超出范围的索引不会产生错误。如果start
参数的值大于有序集合中的最大索引,或者start
>stop
,将会返回一个空列表。如果stop
的值大于有序集合的末尾,Redis会将其视为有序集合的最后一个元素。 其中参数:
BYSCORE
: 获取分数介于start
和stop
之间(包括等于start
或stop
)的成员,此时start
和stop
用分数表示,若需要不包含start
或stop
, 可以配合(
、)
使用,如(start
表示不包含start
, 如需获取所有成员,但是不知道有序集的最低和最高score
值, 可以使用-inf
(表示集合中最小分数) 和+inf
(表示集合中最大分数)分别作为start
和stop
。BYLEX
: 按照字典排序获取集合,此时start
和stop
用字典值(任意字符串,在Redis中会转化成ASCII字符串和集合中元素进行比较)表示,start
和stop
需要使用(
或[
开头指明是否包含字典值,其中[
表示包含字典值,(
表示不包含,若要获取所有成员,需要使用start
和stop
的特殊值:+
或-
分别表示正无限和负无限字符串。REV
: 反转排序集,将索引0作为得分最高的元素最后输出。LIMIT
: 类似SQL中的分页,用于从匹配元素中获取子范围集合,如果count
为负数,将返回offset
之后的所有元素。WITHSCORES
: 表示将元素与分数一起返回。 应用场景: 商品列表排序, 主播打赏排行榜
## 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
参数作用等效。
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
值介于min
和max
之间(包括等于min
或max
)的成员。有序集成员按 score 值递增(从小到大)次序排列。具有相同score
值的成员按字典序来排列。自Redis 6.2.0之后被置为过时,用ZRANGE
命令配合BYSCORE
参数作用等效。
LIMIT
: 参数指定返回结果的数量及区间(就像SQL中的分页功能),注意当offset
很大时,定位offset
的操作可能需要遍历整个有序集。WITHSCORES
: 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其score
值一起返回。
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 。
127.0.0.1:6379> zscore zset1 100
"5"
127.0.0.1:6379> zscore zset1 1000
(nil)
6. ZCARD命令
语法: ZCARD key
用于返回有序集的成员个数,当key不存在时,返回0。
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存在,但是不是有序集合类型时,返回类型错误。
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 value
。score
值可以是字符串形式表示的整数值或双精度浮点数。
可以通过传递一个负数值increment
,让score
减去相应的值,比如ZINCRBY key -2 member
,就是让member
的score
值减去2 。
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
值在min
和max
之间(默认包括score
值等于min
或max
)的成员的数量。
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,如果超过列表的大小,将弹出所有元素。
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。
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
作用相反。
127.0.0.1:6379> zrevrank zset2 40
(integer) 0