zadd 向有序集合中添加一个或多个成员,当已存在某个成员时,更新其分数

127.0.0.1:6379> zadd myzset 1 Kangkang 2 Tom 5 Jane 4 Mike 3 Mairy
(integer) 5
127.0.0.1:6379> zrange myzset 0 -1   # 可见,输出的顺序也是按照成员的分数来进行排序的
1) "Kangkang"
2) "Tom"
3) "Mairy"
4) "Mike"
5) "Jane"

zrange 通过索引区间返回有序集合成指定区间内的成员

# zrange key start stop [WITHSCORES]
127.0.0.1:6379> zadd salary Tom 1000
(error) ERR value is not a valid float           # 分数必须是float类型
127.0.0.1:6379> zadd salary 3000 Tom 5000 Jane 6000 Kang 10000 Mary
(integer) 4
127.0.0.1:6379> zrange salary 0 -1 withscores    # withscores 表示带上分数输出;0至-1表示输出全部。
1) "Tom"
2) "3000"
3) "Jane"
4) "5000"
5) "Kang"
6) "6000"
7) "Mary"
8) "10000"
127.0.0.1:6379> zrange salary 0 2 withscores    # 显示下标为0至2的成员
1) "Tom"
2) "3000"
3) "Jane"
4) "5000"
5) "Kang"
6) "6000"
127.0.0.1:6379> zrange salary 0 10 withscores   #超出最大下标,会输出全部的成员
1) "Tom"
2) "3000"
3) "Jane"
4) "5000"
5) "Kang"
6) "6000"
7) "Mary"
8) "10000"
127.0.0.1:6379> zrange salary 2 1 withscores   # 索引不符合条件,输出空集合
(empty array)
127.0.0.1:6379> zrange salary 10 20 withscores
(empty array)

zrangebyscore 返回指定分数区间内的成员

127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Kang"
2) "1200"
3) "Jane"
4) "3000"
5) "Mike"
6) "5000"
7) "Mary"
8) "20000"
127.0.0.1:6379> zrangebyscore salary 1000 4000 withscores   #1000 <= score <= 4000
1) "Kang"
2) "1200"
3) "Jane"
4) "3000"
127.0.0.1:6379> zrangebyscore salary (1200 5000 withscores  #1200 < score <= 5000  
1) "Jane"
2) "3000"
3) "Mike"
4) "5000"
127.0.0.1:6379> zrangebyscore salary (1200 (5000 withscores  #1200 <= score <= 5000  
1) "Jane"
2) "3000"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores    #显示全部
1) "Kang"
2) "1200"
3) "Jane"
4) "3000"
5) "Mike"
6) "5000"
7) "Mary"
8) "20000"
127.0.0.1:6379> zrangebyscore salary -inf (5000 withscores   #score < 5000
1) "Kang"
2) "1200"
3) "Jane"
4) "3000"
127.0.0.1:6379> zrangebyscore salary -inf 5000 withscores    #score <= 5000
1) "Kang"
2) "1200"
3) "Jane"
4) "3000"
5) "Mike"
6) "5000"
127.0.0.1:6379> zrangebyscore salary 3000 +inf withscores    #score >= 3000
1) "Jane"
2) "3000"
3) "Mike"
4) "5000"
5) "Mary"
6) "20000"
127.0.0.1:6379> zrangebyscore salary (3000 +inf withscores   #score > 3000
1) "Mike"
2) "5000"
3) "Mary"
4) "20000"

zrangebylex 输出指定字典区间的成员

127.0.0.1:6379> ZADD myzset 0 a 0 b 0 y 0 x 0 z 0 d 0 e 0 f 0 g    #score 相同
(integer) 9
127.0.0.1:6379> zrange myzset 0 -1
1) "a"
2) "b"
3) "d"
4) "e"
5) "f"
6) "g"
7) "x"
8) "y"
9) "z"                                   #输出是按照a b c d e f g h .... y z的顺序
127.0.0.1:6379> zrangebylex myzset - [e  #输出的集合范围是:[开始,e]
1) "a"
2) "b"
3) "d"
4) "e"
127.0.0.1:6379> zrangebylex myzset [d [y #输出集合范围是:[d,y]
1) "d"
2) "e"
3) "f"
4) "g"
5) "x"
6) "y"
127.0.0.1:6379> zrangebylex myzset (d [y #输出集合范围是:(d,y]
1) "e"
2) "f"
3) "g"
4) "x"
5) "y"
127.0.0.1:6379> zrangebylex myzset (d (y
1) "e"
2) "f"
3) "g"
4) "x"
# '[' 或者 ']' 表示闭区间,同理,'(' 和 ')' 表示开区间
# 命令中海油一个参数 limit offset count,表示在【给定范围】的集合中,输出从 offset下标开始,计数count个数,示例:
127.0.0.1:6379> zrangebylex myzset - [z
1) "a"
2) "b"
3) "d"
4) "e"
5) "f"
6) "g"
7) "x"
8) "y"
9) "z"
127.0.0.1:6379> zrangebylex myzset - [z limit 3 5    #从下标3开始,也就是第4个,输出5个成员
1) "e"
2) "f"
3) "g"
4) "x"
5) "y"

zrem 移除zset中的一个或多个成员

127.0.0.1:6379> zrem salary Tom Jane
(integer) 2
127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Kang"
2) "6000"
3) "Mary"
4) "10000"
127.0.0.1:6379> zrem salary Kang HanHan      # zrem中,如果有不存在的成员,则跳过,是一个非原子性操作
(integer) 1
127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Mary"
2) "10000"

zremrangebyscore 移除给定分数区间的成员

127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Kang"
2) "1200"
3) "Jane"
4) "3000"
5) "Mike"
6) "5000"
7) "Mary"
8) "20000"
127.0.0.1:6379> zremrangebyscore salary 1200 3000    #移除区间[2000,3000]内的成员,注意,默认是闭区间
(integer) 2
127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Mike"
2) "5000"
3) "Mary"
4) "20000"
127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Kang"
2) "1200"
3) "Jane"
4) "3000"
5) "Mike"
6) "5000"
7) "Mary"
8) "20000"
127.0.0.1:6379> zremrangebyscore salary (1200 (3000   #区间范围:(2000,3000)
(integer) 0
127.0.0.1:6379> zremrangebyscore salary (1200 3000    #区间范围:(2000,3000],注意,在命令中没有指定闭区间的符号,'[' 并不适用。
(integer) 1
127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Kang"
2) "1200"
3) "Mike"
4) "5000"
5) "Mary"
6) "20000"

zremrangerank 移除指定排名区间的成员

127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Kang"
2) "1200"
3) "Jane"
4) "3000"
5) "Tom"
6) "5000"
7) "Mary"
8) "20000"
127.0.0.1:6379> zremrangebyrank salary 0 1    #指定排名区间为:[0,1],注意,命令中没有指定开闭合区间的符号,'(' 和 '[' 在此不适用
(integer) 2
127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Tom"
2) "5000"
3) "Mary"
4) "20000"

zcount 命令 - 计算在有序集合中指定区间分数的成员数

127.0.0.1:6379> zrange myzset 0 -1 withscores
 1) "Kangkang"
 2) "1"
 3) "Tom"
 4) "2"
 5) "Mairy"
 6) "3"
 7) "Mike"
 8) "4"
 9) "Jane"
10) "5"
127.0.0.1:6379> zcount myzset 1 3       # 1至3表示指定的分数区间
(integer) 3                             # 分数区间内的成员个数
127.0.0.1:6379> zcount myzset 1 10
(integer) 5
127.0.0.1:6379> zcount myzset 20 30
(integer) 0

zlexcount 返回指定字典区间的成员个数

#注意:[  和  (  有区别
127.0.0.1:6379> zrange myzset 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
127.0.0.1:6379> zlexcount myzset [a [d
(integer) 4
127.0.0.1:6379> zlexcount myzset [a (d
(integer) 3
127.0.0.1:6379> zlexcount myzset (a?(d
(integer) 2

zcard 返回集合的成员数

127.0.0.1:6379> zrange salary 0 -1
1) "Kang"
2) "Jane"
3) "Mike"
4) "Mary"
127.0.0.1:6379> zcard salary
(integer) 4

zrevrange 返回有序集中指定区间内的成员,通过索引,分数从高到底

127.0.0.1:6379> zrevrange salary 0 -1 withscores    #分数从高到低
1) "Mary"
2) "20000"
3) "Mike"
4) "5000"
5) "Jane"
6) "3000"
7) "Kang"
8) "1000"
127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Kang"
2) "1000"
3) "Jane"
4) "3000"
5) "Mike"
6) "5000"
7) "Mary"
8) "20000"

zrevrangebyscore 返回指定分数区间的成员,分数从高到低

127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Kang"
2) "1200"
3) "Jane"
4) "3000"
5) "Tom"
6) "5000"
7) "Mary"
8) "20000"
127.0.0.1:6379> zrevrangebyscore salary (20000 (1200 withscores #分数区间(20000,1200),开区间
1) "Tom"
2) "5000"
3) "Jane"
4) "3000"
127.0.0.1:6379> zrevrangebyscore salary 20000 1200 withscores   #默认是闭区间,没有表示闭区间的符号,'[' 在此并不适用
1) "Mary"
2) "20000"
3) "Tom"
4) "5000"
5) "Jane"
6) "3000"
7) "Kang"
8) "1200"

zremrangebylex 移除指定字典区间的成员

127.0.0.1:6379> zadd myzset 0 apple 0 all 0 banana 0 box 0 call 0 clear 0 china 0 delete 0 deafult 0 eye 0 xshell 0 yeah 0 zip 0 zhuan
127.0.0.1:6379> zremrangebylex myzset [b [d #这里使用中括号或者小括号都可以,二者没有区别,表示的意思都是[b,d)
(integer) 5
127.0.0.1:6379> zrange myzset 0 -1 
1) "all"
2) "apple"
3) "deafult"
4) "delete"
5) "eye"
6) "xshell"
7) "yeah"
8) "zhuan"
9) "zip"
127.0.0.1:6379> zremrangebylex myzset (app (z   #范围是[app,z)
(integer) 6
127.0.0.1:6379> zrange myzset 0 -1 
1) "all"
2) "zhuan"
3) "zip"

zrank、zrevrank 正序和反序输出成员的排名

127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Kang"
2) "1000"
3) "Jane"
4) "3000"
5) "Mike"
6) "5000"
7) "Mary"
8) "20000"
127.0.0.1:6379> zrank salary Kang         # 正序输出Kang的排名
(integer) 0                               # 排名第1
127.0.0.1:6379> zrank salary Mike
(integer) 2
127.0.0.1:6379> zrevrank salary Kang      # 反序输出Kang的排名
(integer) 3                               # 排名第4
127.0.0.1:6379> zrevrank salary Jane
(integer) 2

zincrby 指定集合中的某个成员的score 增加指定步长increment

127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Kang"
2) "1000"
3) "Jane"
4) "3000"
5) "Mike"
6) "5000"
7) "Mary"
8) "20000"
127.0.0.1:6379> zincrby salary 100 Kang
"1100"
127.0.0.1:6379> zincrby salary 100 Kang
"1200"

zunion 返回一个或者多个集合的并集

127.0.0.1:6379> zadd class1 100 Tom 120 Jane
(integer) 2
127.0.0.1:6379> zadd class2 99 Kang 150 Chen
(integer) 2
127.0.0.1:6379> zunion 2 class1 class2
1) "Kang"
2) "Tom"
3) "Jane"
4) "Chen"
127.0.0.1:6379> zunion 2 class1 class2 withscores #第一个2表示key的数量
1) "Kang"
2) "99"
3) "Tom"
4) "100"
5) "Jane"
6) "120"
7) "Chen"
8) "150"
127.0.0.1:6379> zunion 2 class1 class2 weights 2 3 withscores #class1和class2并集,并且class1中的所有成员的score乘以2,class2中的所有成员的score乘以3,输出。
1) "Tom"
2) "200"
3) "Jane"
4) "240"
5) "Kang"
6) "297"
7) "Chen"
8) "450"

zunionstore 返回一个或者多个集合的并集,并存储到新的目标集合中

# 相比zunion多了一个目标的集合
127.0.0.1:6379> zadd class1 100 Tom 120 Jane
(integer) 2
127.0.0.1:6379> zadd class2 99 Kang 150 Chen
(integer) 2
127.0.0.1:6379> zunionstore destination 2 class1 class2 weights 2 3 #第一个2表示key的数量,第二个2和3 表示weights的值
(integer) 4
127.0.0.1:6379> zrange destination 0 -1 withscores
1) "Tom"
2) "200"
3) "Jane"
4) "240"
5) "Kang"
6) "297"
7) "Chen"
8) "450"

zset的使用场景

有序集合的使用场景与集合类似,但是set集合不是自动有序的,而sorted set可以利用分数进行成员间的排序,而且是插入时就排序好。所以当你需要一个有序且不重复的集合列表时,就可以选择sorted set数据结构作为选择方案。

1、 排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。

2、用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。