Redis命令-ZSet

zadd key [score1] [member1] … [scoren] [membern]

将一个或多个成员及其分数插入有序集合

如果成员已存在,则更新分数值,并通过重新插入的方式保证位置正确

key不存在时先创建有序集合再插入

Redis 2.4 版本前只可以插入一个元素

分数值可以是整数值或者双精度浮点数

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> zadd zadd-key 1.0 a 2.8 b 1.7 c 2 d 2.5 e
(integer) 5
127.0.0.1:6379> zrange zadd-key 0 -1 withscores
1) "a"
2) "1"
3) "c"
4) "1.7"
5) "d"
6) "2"
7) "e"
8) "2.5"
9) "b"
10) "2.7999999999999998"

zcard [key]

统计集合中成员的数量

1
2
3
4
127.0.0.1:6379> zadd zcard-key 1.0 a 2.8 b 1.7 c 2 d 2.5 e
(integer) 5
127.0.0.1:6379> zcard zadd-key
(integer) 5

zcounut [key] [min] [max]

统计分数在min和max之间的成员数量,包含min和max

1
2
3
4
5
6
127.0.0.1:6379> zadd zcount-key 1.0 a 2.8 b 1.7 c 2 d 2.5 e
(integer) 5
127.0.0.1:6379> zcount zcount-key 1 1.7
(integer) 2
127.0.0.1:6379> zcount zcount-key 1 2
(integer) 3

zincrby [key] [increment] [member]

对成员member的分数加上增量increment,increment可以是负值,返回member增长后的分数,以字符串形式返回

key不存在时,相当于zadd key increment member

分数值可以是整数值或双精度浮点数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 正常情况
127.0.0.1:6379> zadd zincrby-key 1 a 1.6 b 1.9 c
(integer) 3
127.0.0.1:6379> zincrby zincrby-key 2 a
"3"
127.0.0.1:6379> zrange zincrby-key 0 -1 withscores
1) "b"
2) "1.6000000000000001"
3) "c"
4) "1.8999999999999999"
5) "a"
6) "3"

# key不存在
127.0.0.1:6379> exists zincrby-key2
(integer) 0
127.0.0.1:6379> zincrby zincrby-key2 2 a
"2"
127.0.0.1:6379> zrange zincrby-key2 0 -1 withscores
1) "a"
2) "2"

zinterstore [destination-key] [numkeys] [key1] … [keyn] weights [weight1] … [weightn]

计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和。返回保存到目标结果集的的成员数量。

  • WEIGHTS

使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。

如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。

  • AGGREGATE

使用 AGGREGATE 选项,可以指定并集的结果集的聚合方式。

AGGREGATE默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。

1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> zadd key 10 a 11 b 15 c
(integer) 3
127.0.0.1:6379> zadd key2 15 a 16 b 30 d
(integer) 3
127.0.0.1:6379> zadd key3 20 b 30 c 50 e
(integer) 3
127.0.0.1:6379> zinterstore key4 3 key key2 key3 weights 5 5 5 aggregate min
(integer) 1
127.0.0.1:6379> zrange key4 0 -1 withscores
1) "b"
2) "55"

zunionstore [destination-key] [numkeys] [key1] … [keyn] weights [weight1] … [weightn]

计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和。返回保存到目标结果集的的成员数量。

  • WEIGHTS

使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。

如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。

  • AGGREGATE

使用 AGGREGATE 选项,可以指定并集的结果集的聚合方式。

AGGREGATE默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> zadd key9 10 a 11 b 15 c
(integer) 3
127.0.0.1:6379> zadd key10 15 a 16 b 30 d
(integer) 3
127.0.0.1:6379> zadd key11 20 b 30 c 50 e
(integer) 3
127.0.0.1:6379> zunionstore key12 3 key9 key10 key11 weights 5 5 5 aggregate min
(integer) 5
127.0.0.1:6379> zrange key12 0 -1 withscores
1) "a"
2) "50"
3) "b"
4) "55"
5) "c"
6) "75"
7) "d"
8) "150"
9) "e"
10) "250"

zlexcount [key] [min] [max]

计算有序集合中指定字典区间内成员数量,根据前置符号[(来判断是否包含min和max,即闭区间和开区间

min:字典中排序位置较小的成员,必须以[或(开头,可使用”-“代替

max:字典中排序位置较大的成员,必须以[或(开头,可使用”+”代替

min和max不能反,否则返回结果为0

min存在max不存在时,返回分数大于min的分数的成员数量

min不存在时返回0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> zadd key5 10 a 11 b 15 c 16 d 19 e 22 f 21 g 25 h
(integer) 8
127.0.0.1:6379> zlexcount key5 - +
(integer) 8
127.0.0.1:6379> zlexcount key5 [a [f
(integer) 5
127.0.0.1:6379> zlexcount key5 [f [a
(integer) 0
127.0.0.1:6379> zlexcount key5 [a [i
(integer) 8
127.0.0.1:6379> zlexcount key5 [g [i
(integer) 3
127.0.0.1:6379> zlexcount key5 [i [b
(integer) 0

zrange [key] [start] [stop] [withscores]

返回给定key储存的有序集合中指定区间的成员,成员的顺序按照分数从小到大排列

withscores:添加此参数会返回分数值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
127.0.0.1:6379> zrange key5 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "g"
7) "f"
8) "h"
127.0.0.1:6379> zrange key5 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "11"
5) "c"
6) "15"
7) "d"
8) "16"
9) "e"
10) "19"
11) "g"
12) "21"
13) "f"
14) "22"
15) "h"
16) "25"

zrangebylex [key] [min] [max] [limit offset count]

通过字典区间返回min和max之间的成员,min和max说明 同 zlexcount 一致

min:字典中排序位置较小的成员,必须以[或(开头,可使用”-“代替

max:字典中排序位置较大的成员,必须以[或(开头,可使用”+”代替

limit:返回结果是否分页,指令中包含LIMIT后offset、count必须输入

offset:返回结果起始位置,返回结果包含offset对应的成员

count:返回结果数量

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> zrangebylex key5 - +
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "g"
7) "f"
8) "h"
127.0.0.1:6379> zrangebylex key5 - + limit 3 3
1) "d"
2) "e"
3) "g"

zrangebyscore [key] [min] [max] [withscores] [limit offset count]

返回有序集合中指定分数区间的成员列表,有序集成员按分数值递增(从小到大)次序排列.具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)

默认使用闭区间(小于等于或大于等于),也可以通过给参数前增加(符号来使用可选的开区间(小于或大于)

withscores:添加此参数会返回分数值

limit:返回结果是否分页,指令中包含LIMIT后offset、count必须输入

offset:返回结果起始位置,返回结果包含offset对应的成员

count:返回结果数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
127.0.0.1:6379> zrange key5 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "11"
5) "c"
6) "15"
7) "d"
8) "16"
9) "e"
10) "19"
11) "g"
12) "21"
13) "f"
14) "22"
15) "h"
16) "25"
127.0.0.1:6379> zrangebyscore key5 10 16
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> zrangebyscore key5 (10 (16
1) "b"
2) "c"
127.0.0.1:6379> zrangebyscore key5 10 16 withscores
1) "a"
2) "10"
3) "b"
4) "11"
5) "c"
6) "15"
7) "d"
8) "16"
127.0.0.1:6379> zrangebyscore key5 10 16 withscores limit 0 2
1) "a"
2) "10"
3) "b"
4) "11"

zrank [key] [member]

返回有序集合中指定成员的排名,有序集成员按分数值递增(从小到大)顺序排列

排名结果从0开始

如果member不存在,则返回nil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
127.0.0.1:6379> zrange key5 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "11"
5) "c"
6) "15"
7) "d"
8) "16"
9) "e"
10) "19"
11) "g"
12) "21"
13) "f"
14) "22"
15) "h"
16) "25"
127.0.0.1:6379> zrank key5 c
(integer) 2
127.0.0.1:6379> zrank key5 n
(nil)

zrem [key] [member1] [member2]

移除一个或多个成员,不存在的成员将被忽略,返回被成功移除的数量

Redis 2.4 版本以前每次只能删除一个元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> zrange key5 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "g"
7) "f"
8) "h"
127.0.0.1:6379> zrem key5 g f h
(integer) 3
127.0.0.1:6379> zrange key5 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"

zremrangebylex [key] [min] [max]

移除有序集合中给定的字典区间的所有成员,返回移除的元素数

min:字典中排序位置较小的成员,必须以[或(开头,可使用”-“代替

max:字典中排序位置较大的成员,必须以[或(开头,可使用”+”代替

1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> zrange key5 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> zremrangebylex key5 [a [c
(integer) 3
127.0.0.1:6379> zrange key5 0 -1
1) "d"
2) "e"

zremrangebyrank [key] [start] [stop]

移除有序集中,指定排名(rank)在start和stop区间内的所有成员,包含start和stop,返回移除的元素数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
127.0.0.1:6379> zadd key6 10 a 11 b 12 c 13 d 14 e 15 f 16 g 17 h
(integer) 8
127.0.0.1:6379> zrange key6 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
8) "h"
127.0.0.1:6379> zremrangebyrank key6 0 3
(integer) 4
127.0.0.1:6379> zrange key6 0 -1
1) "e"
2) "f"
3) "g"
4) "h"

zremrangebyscore [key] [start] [stop]

移除有序集中,指定分数(score)在start和stop区间内的所有成员,包含start和stop,返回移除的元素数

默认使用闭区间(小于等于或大于等于),也可以通过给参数前增加(符号来使用可选的开区间(小于或大于)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> zrange key6 0 -1 withscores
1) "e"
2) "14"
3) "f"
4) "15"
5) "g"
6) "16"
7) "h"
8) "17"
127.0.0.1:6379> zremrangebyscore key6 (14 (16
(integer) 1
127.0.0.1:6379> zremrangebyscore key6 14 16
(integer) 2
127.0.0.1:6379> zrange key6 0 -1 withscores
1) "h"
2) "17"

zrevrange [key] [min] [max] [withscores]

功能与zrange类似,区别在于排序是按照分数由高到低

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
127.0.0.1:6379> zadd key7 10 a 11 b 12 c 13 d 14 e 15 f 16 g 17 h
(integer) 8
127.0.0.1:6379> zrange key7 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "11"
5) "c"
6) "12"
7) "d"
8) "13"
9) "e"
10) "14"
11) "f"
12) "15"
13) "g"
14) "16"
15) "h"
16) "17"
127.0.0.1:6379> zrevrange key7 0 -1 withscores
1) "h"
2) "17"
3) "g"
4) "16"
5) "f"
6) "15"
7) "e"
8) "14"
9) "d"
10) "13"
11) "c"
12) "12"
13) "b"
14) "11"
15) "a"
16) "10"

zrevrangebyscore [key] [min] [max] [withscores] [limit offset count]

功能与zrangebyscore类似,区别在于排序是按照分数由高到低

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
127.0.0.1:6379> zrevrange key7 0 -1 withscores
1) "h"
2) "17"
3) "g"
4) "16"
5) "f"
6) "15"
7) "e"
8) "14"
9) "d"
10) "13"
11) "c"
12) "12"
13) "b"
14) "11"
15) "a"
16) "10"
127.0.0.1:6379> zrevrangebyscore key7 17 13 limit 1 3
1) "g"
2) "f"
3) "e"

zrevrank [key] [member]

功能与zrank类似,区别在于排序是按照分数由高到低

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
127.0.0.1:6379> zrevrange key7 0 -1 withscores
1) "h"
2) "17"
3) "g"
4) "16"
5) "f"
6) "15"
7) "e"
8) "14"
9) "d"
10) "13"
11) "c"
12) "12"
13) "b"
14) "11"
15) "a"
16) "10"
127.0.0.1:6379> zrevrank key7 e
(integer) 3
127.0.0.1:6379> zrevrank key7 o
(nil)

zsore [key] [member]

返回有序集合中指定成员的分数,key不存在或者成员不存在时返回nil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 正常情况
127.0.0.1:6379> zrevrange key7 0 -1 withscores
1) "h"
2) "17"
3) "g"
4) "16"
5) "f"
6) "15"
7) "e"
8) "14"
9) "d"
10) "13"
11) "c"
12) "12"
13) "b"
14) "11"
15) "a"
16) "10"
127.0.0.1:6379> zscore key7 g
"16"

# 成员不存在
127.0.0.1:6379> zscore key7 p
(nil)

# key不存在
127.0.0.1:6379> exists key8
(integer) 0
127.0.0.1:6379> zscore key8 g
(nil)

zscan [key] [cursor] match [pattern] count [count]

迭代有序集合中键的元素(包括元素成员和元素分值),返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员member和一个分值score组成

此命令测试时,count参数无效,无论count参数是几,都会返回全部匹配的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
127.0.0.1:6379> zadd key13 10 a1 11 a2 12 b1 13 b2 14 c1 15 c2 16 a3 17 a4 
(integer) 8
127.0.0.1:6379> zrange key13 0 -1 withscores
1) "a1"
2) "10"
3) "a2"
4) "11"
5) "b1"
6) "12"
7) "b2"
8) "13"
9) "c1"
10) "14"
11) "c2"
12) "15"
13) "a3"
14) "16"
15) "a4"
16) "17"
127.0.0.1:6379> zscan key13 0 match a*
1) "0"
2) 1) "a1"
2) "10"
3) "a2"
4) "11"
5) "a3"
6) "16"
7) "a4"
8) "17"

本文作者:Jormin
本文地址https://blog.lerzen.com/2018/01/16/redis命令-zset/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!

----- 到这结束咯 感谢您的阅读 -----