前言
在上篇文章中,我们学习了Redis Sorted Set的基本概念和部分命令。这部分命令较多,预计还需要两篇文章才能学完,每篇文章在10个命令左右。对于这些命令,不需要全部记住,只需要自己动手操作过一遍,有个印象。在真正需要使用时,能够想到有这种操作,然后再去查阅命令即可。
ZINCRBY
可用版本:>= 1.2.0
时间复杂度: O(log(N)) ,N为有序数组中的元素个数
命令格式
1
|
ZINCRBY key increment member
|
命令描述
- 将有序数组中
member
对应的score
值,加上increment
;
- 如果有序数组中不存在这个
member
元素,那么就新增这个元素,别设置score
值为increment
;
- 如果有序数组不存在,新建有序数组,并添加这个元素;
score
值可以是整数值或双精度浮点数,也可以是负数,相当于减;
- 如果
key
对应的数据类型不是有序数组,返回error;
返回值
字符串:member对应的新score值
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
# 加1
127.0.0.1:6379> zincrby myzset 1 one
"2"
# 减2
127.0.0.1:6379> zincrby myzset -2 one
"0"
# 查看分值
127.0.0.1:6379> zscore myzset one
"0"
|
ZRANK
可用版本:>= 2.0.0
时间复杂度: O(log(N)) ,N为有序数组中的元素个数
命令格式
命令描述
- 按照分值从低到高的顺序,返回元素在有序数组中的排名;
- 排名(索引)从
0
开始,也就是分值最低的元素排名为0
;
返回值
整数:如果member
在有序集合中,返回排名
nil:有序数组不存在或者member
不存在,返回nil
示例
1
2
3
4
5
6
7
8
9
10
11
|
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two
(integer) 1
# 查看排名
127.0.0.1:6379> zrank myzset one
(integer) 0
127.0.0.1:6379> zrank myzset two
(integer) 1
|
ZREVRANK
可用版本:>= 2.0.0
时间复杂度: O(log(N)) ,N为有序数组中的元素个数
命令格式
命令描述
- 与
ZRANK
相反,ZREVRANK
按照分值从高到低的顺序,返回元素在有序数组中的排名;
- 排名(索引)从
0
开始,分值最高的元素排名为0
;
返回值
整数:如果member
在有序集合中,返回排名
nil:有序数组不存在或者member
不存在,返回nil
示例
1
2
3
4
5
6
7
8
9
10
11
12
|
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two
(integer) 1
# 查看排名
127.0.0.1:6379> zrevrank myzset one
(integer) 1
127.0.0.1:6379> zrevrank myzset two
(integer) 0
|
ZREM
可用版本:>= 2.0.0
时间复杂度: O(M*log(N)),N为有序数组中的元素个数,M为命令提供的元素个数
命令变化
自2.4版本后,可以删除多个元素
命令格式
1
|
ZREM key member [member ...]
|
命令描述
- 从有序数组中,移除指定的元素
- 如果元素不存在,忽略该元素
- 如果key存在,但是对应的类型不是有序集合,返回error
返回值
整数:被移除的元素个数(不包含不存在的元素)
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two
(integer) 1
127.0.0.1:6379> zadd myzset 3 three
(integer) 1
# 删除两个存在的,和一个不存在的元素
127.0.0.1:6379> zrem myzset one two notexists
(integer) 2
# 遍历集合
127.0.0.1:6379> zrange myzset 0 -1
1) "three"
|
ZREMRANGEBYRANK
可用版本:>= 2.0.0
时间复杂度: O(M+log(N)),N为有序数组中的元素个数,M为要删除的元素个数
命令格式
1
|
ZREMRANGEBYRANK key start stop
|
命令描述
- 移除有序数组中,排序位于
start
和stop
之间的元素;
start
和stop
为正数索引时,都是从0
开始,0表示分值最小的第一个元素,1为第二个元素,以此类推;
- 如果
start
和stop
为负数,-1
表示分值最大的最后一个元素,-2表示倒数第二个元素,以此类推;
返回值
整数:被移除的元素个数
示例
1
2
3
4
5
6
7
8
9
10
11
12
|
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two
(integer) 1
127.0.0.1:6379> zadd myzset 3 three
(integer) 1
# 移除第二个和第三个元素(索引为1 和 2)
127.0.0.1:6379> zremrangebyrank myzset 1 2
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1
1) "one"
|
ZREMRANGEBYSCORE
可用版本:>= 1.2.0
时间复杂度: O(M+log(N)),N为有序数组中的元素个数,M为要删除的元素个数
命令格式
1
|
ZREMRANGEBYSCORE key min max
|
命令描述
- 移除有序数组中,score值介于
min
和max
之间的元素,默认为闭区间[min,max];
-inf
、+inf
也是合法输入,表示负无穷和正无穷
- 如果想要使用开区间,可以在
min
或max
前加一个'(
'
- 区间取值问题可以参考上一篇的
ZRANGEBYSCORE
返回值
整数:被移除的元素个数
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two
(integer) 1
127.0.0.1:6379> zadd myzset 3 three
(integer) 1
127.0.0.1:6379> zadd myzset 4 four
(integer) 1
# 删除分值[1,2]之间的元素
127.0.0.1:6379> zremrangebyscore myzset 1 2
(integer) 2
# 删除负无穷到4(开区间)之间的元素
127.0.0.1:6379> zremrangebyscore myzset -inf (4
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1
1) "four"
|
ZREMRANGEBYLEX
可用版本:>= 2.8.9
时间复杂度: O(M+log(N)),N为有序数组中的元素个数,M为要删除的元素个数
命令格式
1
|
ZREMRANGEBYLEX key min max
|
命令描述
- 当有序集合中所有元素的score值都一样时,使用字符串字典序排序,删除
min
到max
之间的元素
- 此处的min、max,与上篇文章中的
ZRANGEBYLEX
概念相同
- 如果使用相同的
min
和max
,ZREMRANGEBYLEX
删除的元素和ZREMRANGEBYLEX
返回的元素相同
返回值
整数:被移除的元素个数
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
127.0.0.1:6379> ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e
(integer) 5
127.0.0.1:6379> ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha
(integer) 5
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "ALPHA"
2) "aaaa"
3) "alpha"
4) "b"
5) "c"
6) "d"
7) "e"
8) "foo"
9) "zap"
10) "zip"
# 删除元素
127.0.0.1:6379> ZREMRANGEBYLEX myzset [alpha [omega
(integer) 6
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "ALPHA"
2) "aaaa"
3) "zap"
|
ZLEXCOUNT
可用版本:>= 2.8.9
时间复杂度: O(log(N)),N为有序数组中的元素个数
命令格式
命令描述
- 当有序集合中所有元素的score值都一样时,返回字符串字典序排序后
min
到max
之间的元素
- 此处的min、max,与上篇文章中的
ZRANGEBYLEX
概念相同
返回值
整数:字典序范围内的元素个数
示例
1
2
3
4
5
6
7
8
9
10
11
12
|
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
127.0.0.1:6379> ZADD myzset 0 f 0 g
(integer) 2
# 全部区间
127.0.0.1:6379> ZLEXCOUNT myzset - +
(integer) 7
# [b,f]区间
127.0.0.1:6379> ZLEXCOUNT myzset [b [f
(integer) 5
|
ZPOPMAX
可用版本:>= 5.0.0
时间复杂度: O(log(N)*M),N为有序数组中的元素个数,M为弹出的元素个数
命令格式
命令描述
- 移除并返回前
count
个score
较高的元素
- 如果不指定count值,默认为1
- 如果count超过集合长度,不会报错
- 返回结果中,分值最大的元素在第一个,同时会带有分值
返回值
列表:元素列表及其分值
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
127.0.0.1:6379> ZADD myzset 1 "one"
(integer) 1
127.0.0.1:6379> ZADD myzset 2 "two"
(integer) 1
127.0.0.1:6379> ZADD myzset 3 "three"
(integer) 1
# 默认返回1个
127.0.0.1:6379> ZPOPMAX myzset
1) "three"
2) "3"
# 超过列表长度时,返回所有元素
127.0.0.1:6379> ZPOPMAX myzset 3
1) "two"
2) "2"
3) "one"
4) "1"
|
ZPOPMIN
可用版本:>= 5.0.0
时间复杂度: O(log(N)*M),N为有序数组中的元素个数,M为弹出的元素个数
命令格式
命令描述
- 移除并返回前
count
个score
较低
的元素
- 如果不指定count值,默认为1
- 如果count超过集合长度,不会报错
- 返回结果中,分值最小的元素在第一个,同时会带有分值
返回值
列表:元素列表及其分值
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
127.0.0.1:6379> ZADD myzset 1 "one"
(integer) 1
127.0.0.1:6379> ZADD myzset 2 "two"
(integer) 1
127.0.0.1:6379> ZADD myzset 3 "three"
(integer) 1
# 默认返回1个
127.0.0.1:6379> zpopmin myzset
1) "one"
2) "1"
# 超过列表长度时,返回所有元素
127.0.0.1:6379> zpopmin myzset 3
1) "two"
2) "2"
3) "three"
4) "3"
|
ZMSCORE
可用版本:>= 6.2.0
时间复杂度: O(N),N为命令提供的元素个数
命令格式
1
|
ZMSCORE key member [member ...]
|
命令描述
- 返回多个元素对应的分值
- 如果该元素在有序数组中不存在,返回nil
返回值
数组:提供的所有元素对应的分值列表
示例
1
2
3
4
5
6
7
8
|
127.0.0.1:6379> ZADD myzset 1 "one"
(integer) 1
127.0.0.1:6379> ZADD myzset 2 "two"
(integer) 1
127.0.0.1:6379> ZMSCORE myzset "one" "two" "nofield"
1) "1"
2) "2"
3) (nil)
|
总结
本文介绍了有序集合中的部分相关命令,包括
- ZINCRBY:元素score加上一个值
- ZRANK、ZREVRANK:获取元素在有序数组中的排名
- ZREM:删除元素
- ZREMRANGEBYRANK、ZREMRANGEBYSCORE、ZREMRANGEBYLEX:删除给定区间的元素
- ZLEXCOUNT:返回指定字典序内的元素个数
- ZPOPMAX、ZPOPMIN:移除首/尾前count个元素
- ZMSCORE:返回多个元素的分值
更多
微信公众号:CodePlayer