前言

本篇是有序集合的最后一篇命令学习,主要是针对多个集合之间的操作。话不多说,直接上手搞起!

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 值之和
  • WEIGHTSAGGREGATE 参数说明见面的 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