Redis ZUNIONSTORE命令

Redis ZUNIONSTORE命令教程

Redis 的 ZUNIONSTORE 命令用于计算给定的一个或多个 有序集 的并集,其中给定 KEY 的数量必须以 numKEYs 参数指定,并将该并集(结果集)储存到 destination 。

默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和 。

Redis ZUNIONSTORE命令详解

语法

192.168.98.70:6379> ZUNIONSTORE destination numKEYs KEY [KEY ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

参数

参数 描述
destination 并集存放的集合。
numKEYs 要计算并集的集合的个数。
KEY 有序集合的键。
WEIGHTS WEIGHTS 选项使用的关键字。
weight 乘法因子的值。
AGGREGATE 指定结合聚合方式的关键字。
SUM 使用和做为集合成员的 score。
MIN 将所有集合中某个成员的最小 score 值作为结果集中该成员的 score 值。
MAX 将所有集合中某个成员的最大 score 值作为结果集中该成员的 score 值。

WEIGHTS

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

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

AGGREGATE

使用 AGGREGATE 选项,可以指定并集的结果集的聚合方式。默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之和作为结果集中该成员的 score 值。

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

返回值

保存到 destination 的结果集的基数。

时间复杂度

O(N)+O(M log(M)), N 为给定有序集基数的总和, M 为结果集的基数。

可用版本

>= 2.0.0

案例

计算并集

使用 ZUNIONSTORE 命令,计算集合的并集

192.168.98.70:6379> ZADD haicoder 100 Redis 50 Mongo 200 Mysql 10 SqlServer (integer) 4 192.168.98.70:6379> ZRANGE haicoder 0 -1 WITHSCORES 1) "SqlServer" 2) "10" 3) "Mongo" 4) "50" 5) "Redis" 6) "100" 7) "Mysql" 8) "200" 192.168.98.70:6379> ZADD hicoder 20 HTML 200 CSS 100 Vue 50 JQuery (integer) 4 192.168.98.70:6379> ZRANGE hicoder 0 -1 WITHSCORES 1) "HTML" 2) "20" 3) "JQuery" 4) "50" 5) "Vue" 6) "100" 7) "CSS" 8) "200" 192.168.98.70:6379> ZUNIONSTORE coder 2 haicoder hicoder (integer) 8 192.168.98.70:6379> ZRANGE coder 0 -1 WITHSCORES 1) "SqlServer" 2) "10" 3) "HTML" 4) "20" 5) "JQuery" 6) "50" 7) "Mongo" 8) "50" 9) "Redis" 10) "100" 11) "Vue" 12) "100" 13) "CSS" 14) "200" 15) "Mysql" 16) "200" 192.168.98.70:6379> DEL haicoder hicoder coder (integer) 3

我们首先,使用 ZADD 命令,向键为 haicoder 的集合批量添加元素及其对应的分数值。

最后,我们使用 ZUNIONSTORE 命令,将键为 haicoder 的有序集合与键为 hicoder 的有序集合执行并集,结果存放到有序集合 coder 中,其中参数 2 表示一共有两个集合,即 haicoder 与 hicoder。

指定乘法因子

使用 WEIGHTS 参数,指定乘法因子

192.168.98.70:6379> ZADD haicoder 100 Redis 50 Mongo 200 Mysql 10 SqlServer (integer) 4 192.168.98.70:6379> ZRANGE haicoder 0 -1 WITHSCORES 1) "SqlServer" 2) "10" 3) "Mongo" 4) "50" 5) "Redis" 6) "100" 7) "Mysql" 8) "200" 192.168.98.70:6379> ZADD hicoder 20 HTML 200 CSS 100 Vue 50 JQuery (integer) 4 192.168.98.70:6379> ZRANGE hicoder 0 -1 WITHSCORES 1) "HTML" 2) "20" 3) "JQuery" 4) "50" 5) "Vue" 6) "100" 7) "CSS" 8) "200" 192.168.98.70:6379> ZUNIONSTORE coder 2 haicoder hicoder WEIGHTS 1 2 (integer) 8 192.168.98.70:6379> ZRANGE coder 0 -1 WITHSCORES 1) "SqlServer" 2) "10" 3) "HTML" 4) "40" 5) "Mongo" 6) "50" 7) "JQuery" 8) "100" 9) "Redis" 10) "100" 11) "Mysql" 12) "200" 13) "Vue" 14) "200" 15) "CSS" 16) "400" 192.168.98.70:6379> DEL haicoder hicoder coder (integer) 3

我们首先,使用 ZADD 命令,向键为 haicoder 的集合批量添加元素及其对应的分数值。接着,使用 ZADD 命令,向键为 hicoder 的集合批量添加元素及其对应的分数值。

我们再次,使用 ZUNIONSTORE 命令,将键为 haicoder 的有序集合与键为 hicoder 的有序集合执行并集,结果存放到有序集合 coder 中,并且在执行并集的时候,将集合 haicoder 中的元素分数乘以 1 ,将集合 hicoder 中的元素分数乘以 2,其中 WEIGHTS 参数后面的 1 即是给第一个集合乘以的权重,2 即是给第二个集合 。

重复元素

元素重复时,结果中的分数值以集合的分数和为准

192.168.98.70:6379> ZADD haicoder 100 Redis 50 Mongo 200 Mysql 10 SqlServer (integer) 4 192.168.98.70:6379> ZRANGE haicoder 0 -1 WITHSCORES 1) "SqlServer" 2) "10" 3) "Mongo" 4) "50" 5) "Redis" 6) "100" 7) "Mysql" 8) "200" 192.168.98.70:6379> ZADD hicoder 20 Redis 200 CSS 100 Vue 50 JQuery (integer) 4 192.168.98.70:6379> ZRANGE hicoder 0 -1 WITHSCORES 1) "Redis" 2) "20" 3) "JQuery" 4) "50" 5) "Vue" 6) "100" 7) "CSS" 8) "200" 192.168.98.70:6379> ZUNIONSTORE coder 2 haicoder hicoder (integer) 7 192.168.98.70:6379> ZRANGE coder 0 -1 WITHSCORES 1) "SqlServer" 2) "10" 3) "JQuery" 4) "50" 5) "Mongo" 6) "50" 7) "Vue" 8) "100" 9) "Redis" 10) "120" 11) "CSS" 12) "200" 13) "Mysql" 14) "200" 192.168.98.70:6379> DEL haicoder hicoder coder (integer) 3

我们首先,使用 ZADD 命令,向键为 haicoder 的集合批量添加元素及其对应的分数值。接着,使用 ZADD 命令,向键为 hicoder 的集合批量添加元素及其对应的分数值。

最后,我们使用 ZUNIONSTORE 命令,将键为 haicoder 的有序集合与键为 hicoder 的有序集合执行并集,结果存放到有序集合 coder 中,因为集合 haicoder 和集合 hicoder 都存在元素 Redis,并且第一个集合中的值为 100 , 第二个集合中的值为 20 ,此时执行默认的 sum 操作,所以结果中元素 Redis 的值为 120 。

MIN操作

使用 AGGREGATE 加上 MIN 参数,指定并集时分数以小的为准

192.168.98.70:6379> ZADD haicoder 100 Redis 50 Mongo 200 Mysql 10 SqlServer (integer) 4 192.168.98.70:6379> ZRANGE haicoder 0 -1 WITHSCORES 1) "SqlServer" 2) "10" 3) "Mongo" 4) "50" 5) "Redis" 6) "100" 7) "Mysql" 8) "200" 192.168.98.70:6379> ZADD hicoder 20 Redis 200 CSS 100 Vue 50 JQuery (integer) 4 192.168.98.70:6379> ZRANGE hicoder 0 -1 WITHSCORES 1) "Redis" 2) "20" 3) "JQuery" 4) "50" 5) "Vue" 6) "100" 7) "CSS" 8) "200" 192.168.98.70:6379> ZUNIONSTORE coder 2 haicoder hicoder AGGREGATE MIN (integer) 7 192.168.98.70:6379> ZRANGE coder 0 -1 WITHSCORES 1) "SqlServer" 2) "10" 3) "Redis" 4) "20" 5) "JQuery" 6) "50" 7) "Mongo" 8) "50" 9) "Vue" 10) "100" 11) "CSS" 12) "200" 13) "Mysql" 14) "200" 192.168.98.70:6379> DEL haicoder hicoder coder (integer) 3

我们首先,使用 ZADD 命令,向键为 haicoder 的集合批量添加元素及其对应的分数值。接着,使用 ZADD 命令,向键为 hicoder 的集合批量添加元素及其对应的分数值。

最后,我们使用 ZUNIONSTORE 命令,将键为 haicoder 的有序集合与键为 hicoder 的有序集合执行并集,结果存放到有序集合 coder 中,因为集合 haicoder 和集合 hicoder 都存在元素 Redis,并且第一个集合中的值为 100 , 第二个集合中的值为 20 , 此时使用 AGGREGATE 加上 MIN 参数,指定并集时分数以小的为准。

Redis ZUNIONSTORE命令总结

Redis 的 ZUNIONSTORE 命令用于计算给定的一个或多个有序集的并集,其中给定 KEY 的数量必须以 numKEYs 参数指定,并将该并集(结果集)储存到 destination 。Redis ZUNIONSTORE 命令语法:

192.168.98.70:6379> ZUNIONSTORE destination numKEYs KEY [KEY ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]