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
(integer) 1
127.0.0.1:6379> zadd zset1 2 30 4 50 3 80 -1 10
(integer) 4
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) 67. 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) 510. 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) 112. 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