前言
本篇是有序集合的最后一篇命令学习,主要是针对多个集合之间的操作。话不多说,直接上手搞起!
ZUNIONSTORE
可用版本:>= 2.0.0
时间复杂度: O(N)+O(M*log(M)),N为所有有序集合元素个数之和,M为返回结果的元素个数
命令格式
1
|
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
|
命令描述
-
对给定的有序集合取并集,并将结果存到 destination
中
-
给定 key
的数量必须以 numkeys
参数指定
-
默认情况下,结果集中某个成员的 score
值是所有给定集合下该成员 score
值之和
-
使用 WEIGHTS
选项,你可以为每个有序集合分别指定一个乘法因子(multiplication factor),每个有序集的所有成员的 score
值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。如果没有指定 WEIGHTS
选项,乘法因子默认设置为 1
。
-
使用 AGGREGATE
选项,你可以指定并集的结果集的聚合方式。
默认参数 SUM
,将所有集合中某个成员的score值之和
作为结果集中该成员的score值;
参数MIN
,将所有集合中某个成员的最小score值
作为结果集中该成员的score值;
参数MAX
,将所有集合中某个成员的最大score值
作为结果集中该成员的score值。
-
如果有序集合destination
已经存在,会被覆盖
返回值
整数:结果集的元素个数
示例
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
|
# 构造zset1
127.0.0.1:6379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset1 2 "two"
(integer) 1
# 构造zset2
127.0.0.1:6379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset2 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset2 3 "three"
(integer) 1
# 乘法因子分别为2,3
# 1*2 + 1*3 = 5; 2*2 + 3*2 = 10
127.0.0.1:6379> ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 3
127.0.0.1:6379> zrange out 0 -1 withscores
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"
6) "10"
|
ZUNION
可用版本:>= 6.2.0
时间复杂度: O(N)+O(M*log(M)),N为所有有序集合元素个数之和,M为返回结果的元素个数
命令格式
1
|
ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
|
命令描述
- 与
ZUNIONSTORE
命令类似,唯一区别是:ZUNIONSTORE
将结果存入另一个有序集合中,而ZUNION
直接返回给客户端,不保存结果
返回值
数组:结果集(如果使用了WITHSCORES,同时会返回score值)
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# 构造zset1
127.0.0.1:6379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset1 2 "two"
(integer) 1
# 构造zset2
127.0.0.1:6379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset2 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset2 3 "three"
(integer) 1
# 乘法因子分别为2,3,直接返回结果
# 1*2 + 1*3 = 5; 2*2 + 3*2 = 10
127.0.0.1:6379> zunion 2 zset1 zset2 weights 2 3 withscores
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"
6) "10"
|
ZINTERSTORE
可用版本:>= 2.0.0
时间复杂度: O(N*K)+O(M*log(M)),N为最小有序集合长度,K为有序集合个数,M为返回结果的元素个数
命令格式
1
|
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
|
命令描述
- 对给定的有序集合取交集,并将结果存到
destination
中
- 给定
key
的数量必须以 numkeys
参数指定
- 默认情况下,结果集中某个成员的
score
值是所有给定集下该成员 score
值之和
WEIGHTS
和 AGGREGATE
参数说明见面的 ZUNIONSTORE
- 如果有序集合
destination
已经存在,会被覆盖
返回值
整数:结果集的元素个数
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# 构造zset1
127.0.0.1:6379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset1 2 "two"
(integer) 1
# 构造zset2
127.0.0.1:6379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset2 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset2 3 "three"
(integer) 1
# 取交集
127.0.0.1:6379> ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 2
127.0.0.1:6379> zrange out 0 -1 withscores
1) "one"
2) "5"
3) "two"
4) "10"
|
ZINTER
可用版本:>= 6.2.0
时间复杂度:O(N*K)+O(M*log(M)),N为最小有序集合长度,K为有序集合个数,M为返回结果的元素个数
命令格式
1
|
ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
|
命令描述
- 与
ZINTERSTORE
命令类似,唯一区别是:ZINTERSTORE
将结果存入另一个有序集合中,而ZINTER
直接返回给客户端,不保存结果
返回值
数组:结果集(如果使用了WITHSCORES,同时会返回score值)
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 构造zset1
127.0.0.1:6379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset1 2 "two"
(integer) 1
# 构造zset2
127.0.0.1:6379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset2 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset2 3 "three"
(integer) 1
# ZINTER取交集
127.0.0.1:6379> ZINTER 2 zset1 zset2 WITHSCORES
1) "one"
2) "2"
3) "two"
4) "4"
|
ZINTERCARD
可用版本:>= 7.0.0
时间复杂度:O(N*K),N为最小有序集合长度,K为有序集合个数
命令格式
1
|
ZINTERCARD numkeys key [key ...]
|
命令描述
- 与
ZINTER
命令类似,区别是:ZINTERCARD
返回结果集的长度,而ZINTER
返回结果
- 如果key不存在,被认为是空集,因此结果集也是空集
返回值
整数值:结果集长度
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 构造zset1
127.0.0.1:6379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset1 2 "two"
(integer) 1
# 构造zset2
127.0.0.1:6379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset2 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset2 3 "three"
(integer) 1
# 当前安装版本不支持该命令,感兴趣的小伙伴可以安装高版本试下
127.0.0.1:6379> ZINTERCARD 2 zset1 zset2
(error) ERR unknown command `ZINTERCARD`, with args beginning with: `2`, `zset1`, `zset2`,
|
ZDIFFSTORE
可用版本:>= 6.2.0
时间复杂度:O(L + (N-K)log(N)),L为所有有序集合元素之和,N为第一个集合长度,K是结果集长度
命令格式
1
|
ZDIFFSTORE destination numkeys key [key ...]
|
命令描述
- 计算第一个有序集合与其余所有集合的差集,并将结果保存至destination
- 给定
key
的数量必须以 numkeys
参数指定
- 如果key不存在,被认为是空集
- 如果有序集合
destination
已经存在,会被覆盖
返回值
整数值:结果集长度
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# zset1
127.0.0.1:6379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset1 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset1 3 "three"
(integer) 1
# zset2
127.0.0.1:6379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset2 2 "two"
(integer) 1
# zdiffstore
127.0.0.1:6379> ZDIFFSTORE out 2 zset1 zset2
(integer) 1
127.0.0.1:6379> ZRANGE out 0 -1 WITHSCORES
1) "three"
2) "3"
|
ZDIFF
可用版本:>= 6.2.0
时间复杂度:O(L + (N-K)log(N)),L为所有有序集合元素之和,N为第一个集合长度,K是结果集长度
命令格式
1
|
ZDIFF numkeys key [key ...] [WITHSCORES]
|
命令描述
- 与
ZDIFFSTORE
命令类似,唯一区别是:ZDIFFSTORE
将结果存入另一个有序集合中,而ZDIFF
直接返回给客户端,不保存结果
返回值
数组:结果集(如果使用了WITHSCORES,同时会返回score值)
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# zset1
127.0.0.1:6379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset1 2 "two"
(integer) 1
127.0.0.1:6379> ZADD zset1 3 "three"
(integer) 1
# zset2
127.0.0.1:6379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:6379> ZADD zset2 2 "two"
(integer) 1
# zdiff
127.0.0.1:6379> ZDIFF 2 zset1 zset2
1) "three"
127.0.0.1:6379> ZDIFF 2 zset1 zset2 WITHSCORES
1) "three"
2) "3"
|
总结
本文介绍了有序集合中,多个集合之间操作的相关命令,包括
- ZUNIONSTORE、ZUNION:并集操作
- ZINTERSTORE、ZINTER、ZINTERCARD:交集操作
- ZDIFFSTORE、ZDIFF:差集操作
更多
微信公众号:CodePlayer