Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)
一、Zset有序集合类型介绍
有序集合保留了集合不能有重复成员的特点。但和集合不同的是,有序集合中的每一个元素都有一个唯一的浮点类型的分数(score)与之关联,这使得有序集合中的元素是可以维持有序性的。
有序集合中的有序并不是用下标作为排序依据,而是使用分数(score)。有序集合中的元素不允许重复,但分数是允许重复的。类比大家的身份证上身份证号都是不一致的,但可能身份证上的姓名可能是一致的。
二、常见命令
1、ZADD
添加或更新指定元素以及关联的分数到 zset 中。分数应该符合 double 类型,+inf / -inf 作为正负极限也是合法的。
语法:
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
[ ]内是选填项,其他的是必填项
NX:只在key不存在时才设置,如果设置前key已存在,则不执行
XX:只在key存在时才设置,如果设置前key不存在,则不执行
CH:默认情况下,ZADD返回添加的元素个数,加上CH后返回本次更新的元素的个数
INCR:将元素的分数加上指定的分数,此时只能指定应该元素和分数
返回值:
本次添加成功的元素个数
示例:
127.0.0.1:6379> ZADD mykey 1 one
(integer) 1
127.0.0.1:6379> ZADD mykey two two
(error) ERR value is not a valid float
127.0.0.1:6379> ZADD mykey 2 two 3 three
(integer) 2
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
127.0.0.1:6379> ZADD mykey 1.1 one 2.2 two 3.3 three
(integer) 0
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1.1000000000000001"
3) "two"
4) "2.2000000000000002"
5) "three"
6) "3.2999999999999998"
127.0.0.1:6379> ZADD mykey CH 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
127.0.0.1:6379> ZADD mykey XX 4 four
(integer) 0
127.0.0.1:6379> ZADD mykey NX 4 four
(integer) 1
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
127.0.0.1:6379> ZADD mykey INCR 10 one
"11"
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "two"
2) "2"
3) "three"
4) "3"
5) "four"
6) "4"
7) "one"
8) "11"
127.0.0.1:6379> ZADD mykey -inf min +inf max
(integer) 2
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "min"
2) "-inf"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
9) "one"
10) "11"
11) "max"
12) "inf"
2、ZCARD
获取 zset 中的元素个数。
语法:
ZCARD key
返回值:
zset 中的元素个数
示例:
127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZCARD mykey
(integer) 3
127.0.0.1:6379> ZCARD nilkey
(integer) 0
3、ZCOUNT
返回分数在 min 和 max 之间的元素个数。默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
语法:
ZCOUNT key min max
返回值:
满足条件的元素列表个数
示例:
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
9) "five"
10) "5"
11) "six"
12) "6"
127.0.0.1:6379> ZCOUNT mykey 1 3 #查找范围为 [1,3]
(integer) 3
127.0.0.1:6379> ZCOUNT mykey 1 (3 #查找范围为 [1,3)
(integer) 2
127.0.0.1:6379> ZCOUNT mykey (1 (3 #查找范围为 (1,3)
(integer) 1
127.0.0.1:6379> ZCOUNT mykey 0 100
(integer) 6
4、ZRANGE
返回指定区间的元素,分数按升序输出。带上WITHSCORES可以把分数也一起返回。
语法:
ZRANGE key start stop [WITHSCORES]
此处的 [start,stop] 为下标构成的区间,从0开始,支持负数
返回值:
区间内的元素列表
示例:
127.0.0.1:6379> ZRANGE mykey 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
6) "six"
127.0.0.1:6379> ZRANGE mykey 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
9) "five"
10) "5"
11) "six"
12) "6"
127.0.0.1:6379> ZRANGE mykey 2 5
1) "three"
2) "four"
3) "five"
4) "six"
127.0.0.1:6379> ZRANGE mykey 2 5 WITHSCORES
1) "three"
2) "3"
3) "four"
4) "4"
5) "five"
6) "5"
7) "six"
8) "6"
127.0.0.1:6379> ZRANGE mykey -6 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
6) "six"
127.0.0.1:6379> ZRANGE mykey -6 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
9) "five"
10) "5"
11) "six"
12) "6"
5、ZREVRANGE
返回指定区间的元素,分数按照降序。带上WITHSCORES可以把分数也一起返回。
语法:
ZREVRANGE key start stop [WITHSCORES]
返回值:
区间内的元素列表
示例:
127.0.0.1:6379> ZREVRANGE mykey 0 -1
1) "six"
2) "five"
3) "four"
4) "three"
5) "two"
6) "one"
127.0.0.1:6379> ZREVRANGE mykey 0 -1 WITHSCORES
1) "six"
2) "6"
3) "five"
4) "5"
5) "four"
6) "4"
7) "three"
8) "3"
9) "two"
10) "2"
11) "one"
12) "1"
127.0.0.1:6379> ZREVRANGE mykey -6 -1
1) "six"
2) "five"
3) "four"
4) "three"
5) "two"
6) "one"
127.0.0.1:6379> ZREVRANGE mykey -6 -1 WITHSCORES
1) "six"
2) "6"
3) "five"
4) "5"
5) "four"
6) "4"
7) "three"
8) "3"
9) "two"
10) "2"
11) "one"
12) "1"
127.0.0.1:6379> ZREVRANGE mykey 2 5
1) "four"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> ZREVRANGE mykey 0 100
1) "six"
2) "five"
3) "four"
4) "three"
5) "two"
6) "one"
6、ZRANGEBYSCORE
返回分数在 min 和 max 之间的元素,升序。默认情况下,min 和 max 都是包含的,可以通过(排除。
语法:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回值:
区间内的元素列表
示例:
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
9) "five"
10) "5"
11) "six"
12) "6"
127.0.0.1:6379> ZRANGEBYSCORE mykey 1 2
1) "one"
2) "two"
127.0.0.1:6379> ZRANGEBYSCORE mykey 1 6
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
6) "six"
127.0.0.1:6379> ZRANGEBYSCORE mykey (1 (6
1) "two"
2) "three"
3) "four"
4) "five"
7、ZREVRANGEBYSCORE
返回分数在 max 和 min 之间的元素,降序。默认情况下,min 和 max 都是包含的,可以通过(排除。
语法:
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
返回值:
区间内的元素列表
示例:
127.0.0.1:6379> zadd mykey 1 one 2 two 3 three 4 four 5 five
(integer) 0
127.0.0.1:6379> ZREVRANGEBYSCORE mykey 2 1 withscores
1) "two"
2) "2"
3) "one"
4) "1"
127.0.0.1:6379> ZREVRANGEBYSCORE mykey 2 1
1) "two"
2) "one"
127.0.0.1:6379> ZREVRANGEBYSCORE mykey 5 1 withscores
1) "five"
2) "5"
3) "four"
4) "4"
5) "three"
6) "3"
7) "two"
8) "2"
9) "one"
10) "1"
127.0.0.1:6379> ZREVRANGEBYSCORE mykey (5 (1 withscores
1) "four"
2) "4"
3) "three"
4) "3"
5) "two"
6) "2"
8、ZPOPMAX
删除并返回分数最高的 count 个元素。
语法:
ZPOPMAX key [count]
返回值:
分数和元素列表
示例:
127.0.0.1:6379> ZPOPMAX mykey
1) "six"
2) "6"
127.0.0.1:6379> ZPOPMAX mykey 3
1) "five"
2) "5"
3) "four"
4) "4"
5) "three"
6) "3"
127.0.0.1:6379> ZPOPMAX mykey 3
1) "two"
2) "2"
3) "one"
4) "1"
9、ZPOPMIN
删除并返回分数最低的 count 个元素。
语法:
ZPOPMIN key [count]
返回值:
分数和元素列表
示例:
127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZPOPMIN mykey
1) "one"
2) "1"
127.0.0.1:6379> ZPOPMIN mykey 2
1) "two"
2) "2"
3) "three"
4) "3"
127.0.0.1:6379> ZPOPMIN mykey 3
(empty array)
10、ZRANK
返回指定元素的排名,升序。
语法:
ZRANK key member
返回值:
排名
示例:
127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZRANK mykey one
(integer) 0
127.0.0.1:6379> ZRANK mykey two
(integer) 1
127.0.0.1:6379> ZRANK mykey three
(integer) 2
127.0.0.1:6379> ZRANK mykey four
(nil)
11、ZREVRANK
返回指定元素的排名,降序。
语法:
ZREVRANK key member
返回值:
排名
示例:
127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZREVRANK mykey one
(integer) 2
127.0.0.1:6379> ZREVRANK mykey two
(integer) 1
127.0.0.1:6379> ZREVRANK mykey three
(integer) 0
127.0.0.1:6379> ZREVRANK mykey four
(nil)
12、ZSCORE
返回指定元素的分数。
语法:
ZSCORE key member
返回值:
分数
示例:
127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZSCORE mykey one
"1"
127.0.0.1:6379> ZSCORE mykey two
"2"
127.0.0.1:6379> ZSCORE mykey three
"3"
127.0.0.1:6379> ZSCORE mykey four
(nil)
13、ZREM
删除指定的元素。
语法:
ZREM key member [member ...]
返回值:
本次操作删除的元素个数
示例:
127.0.0.1:6379> zadd mykey 1 one 2 two 3 three 4 four 5 five
(integer) 5
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
9) "five"
10) "5"
127.0.0.1:6379> ZREM mykey one
(integer) 1
127.0.0.1:6379> ZREM mykey three five
(integer) 2
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "two"
2) "2"
3) "four"
4) "4"
14、ZREMRANGEBYRANK
按照排序,升序删除指定范围的元素,左闭右闭。
语法:
ZREMRANGEBYRANK key start stop
返回值:
本次操作删除的元素个数
示例:
127.0.0.1:6379> zadd mykey 1 one 2 two 3 three 4 four 5 five
(integer) 5
127.0.0.1:6379> ZREMRANGEBYRANK mykey 0 1
(integer) 2
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "three"
2) "3"
3) "four"
4) "4"
5) "five"
6) "5"
15、ZREMRANGEBYSCORE
按照分数删除指定范围的元素,左闭右闭。
语法:
ZREMRANGEBYSCORE key min max
返回值:
本次操作删除的元素个数
示例:
127.0.0.1:6379> zadd mykey 1 one 2 two 3 three 4 four 5 five
(integer) 5
127.0.0.1:6379> ZREMRANGEBYSCORE mykey 1 3
(integer) 3
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "four"
2) "4"
3) "five"
4) "5"
16、ZINCRBY
为指定的元素的关联分数添加指定的分数值。
语法:
ZINCRBY key increment member
返回值:
增添后元素的分数
示例:
127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZINCRBY mykey 10 one
"11"
127.0.0.1:6379> ZINCRBY mykey 20 two
"22"
127.0.0.1:6379> ZINCRBY mykey -10 three
"-7"
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "three"
2) "-7"
3) "one"
4) "11"
5) "two"
6) "22"
17、阻塞版本命令
阻塞版本和非阻塞版本的作用基本一致,二者异同点:
· 在列表中有元素的前提下,阻塞版本和非阻塞版本的作用一致。
· 如果列表中没有元素,非阻塞版本会立即返回nil,阻塞版本会根据timeout,阻塞一段时间。期间 redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。
命令中如果设置了多个键,那么会从左到右遍历键,一旦有一个键对应的列表中可以弹出元素,命令立即返回并结束阻塞状态。
(1)BZPOPMAX
ZPOPMAX的阻塞版本,删除并返回分数最高的 count 个元素。
语法:
BZPOPMAX key [key ...] timeout
返回值:
元素列表
示例:
(2)BZPOPMIN
ZPOPMIN的阻塞版本,删除并返回分数最低的 count 个元素。
语法:
BZPOPMIN key [key ...] timeout
返回值:
元素列表
示例:
18、集合间操作命令
(1)交集操作 ZINTERSTORE
求出给定有序集合中元素的交集并保存到目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数。
语法:
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
WEIGHT:指的是权重
AGGREGATE:指的是聚合方式
[] 内不是必填项,默认权重都为1,默认聚合方式是sum
返回值:
目标集合中的元素个数
示例:
127.0.0.1:6379> zadd mykey1 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> zadd mykey2 1 one 2 two
(integer) 2
127.0.0.1:6379> ZINTERSTORE deskey1 2 mykey1 mykey2 weights 2 3
(integer) 2
127.0.0.1:6379> zrange deskey1 0 -1 withscores
1) "one"
2) "5"
3) "two"
4) "10"
127.0.0.1:6379> ZINTERSTORE deskey2 2 mykey1 mykey2 aggregate min
(integer) 2
127.0.0.1:6379> zrange deskey2 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
127.0.0.1:6379> ZINTERSTORE deskey3 2 mykey1 mykey2 aggregate max
(integer) 2
127.0.0.1:6379> zrange deskey3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
(2)并集操作 ZUNIONSTORE
求出给定有序集合中元素的并集并保存到目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数。
语法:
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
返回值:
目标集合中的元素个数
示例:
127.0.0.1:6379> zadd mykey1 11 one 22 two 33 three
(integer) 3
127.0.0.1:6379> zadd mykey2 1 one 2 two
(integer) 2
127.0.0.1:6379> ZUNIONSTORE deskey 2 mykey1 mykey2 weights 1 2
(integer) 3
127.0.0.1:6379> zrange deskey 0 -1 withscores
1) "one"
2) "13"
3) "two"
4) "26"
5) "three"
6) "33"