Redis ZINTERSTORE命令

Redis ZINTERSTORE命令教程

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

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

Redis ZINTERSTORE命令详解

语法

192.168.98.70:6379> ZINTERSTORE 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(NK)+O(Mlog(M)), N 为给定 KEY 中基数最小的有序集, K 为给定有序集的数量, M 为结果集的基数。

可用版本

>= 2.0.0

案例

计算交集

使用 ZINTERSTORE 命令,计算集合的交集

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 Mysql 50 JQuery (integer) 4 192.168.98.70:6379> ZRANGE hicoder 0 -1 WITHSCORES 1) "Redis" 2) "20" 3) "JQuery" 4) "50" 5) "Mysql" 6) "100" 7) "CSS" 8) "200" 192.168.98.70:6379> ZINTERSTORE coder 2 haicoder hicoder (integer) 2 192.168.98.70:6379> ZRANGE coder 0 -1 WITHSCORES 1) "Redis" 2) "120" 3) "Mysql" 4) "300" 192.168.98.70:6379> DEL haicoder hicoder coder (integer) 3

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

最后,我们使用 ZINTERSTORE 命令,将键为 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 Redis 200 CSS 100 Mysql 50 JQuery (integer) 4 192.168.98.70:6379> ZRANGE hicoder 0 -1 WITHSCORES 1) "Redis" 2) "20" 3) "JQuery" 4) "50" 5) "Mysql" 6) "100" 7) "CSS" 8) "200" 192.168.98.70:6379> ZINTERSTORE coder 2 haicoder hicoder WEIGHTS 1 2 (integer) 2 192.168.98.70:6379> ZRANGE coder 0 -1 WITHSCORES 1) "Redis" 2) "140" 3) "Mysql" 4) "400" 192.168.98.70:6379> DEL haicoder hicoder coder (integer) 3

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

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

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 Mysql 50 JQuery (integer) 4 192.168.98.70:6379> ZRANGE hicoder 0 -1 WITHSCORES 1) "Redis" 2) "20" 3) "JQuery" 4) "50" 5) "Mysql" 6) "100" 7) "CSS" 8) "200" 192.168.98.70:6379> ZINTERSTORE coder 2 haicoder hicoder AGGREGATE MIN (integer) 2 192.168.98.70:6379> ZRANGE coder 0 -1 WITHSCORES 1) "Redis" 2) "20" 3) "Mysql" 4) "100" 192.168.98.70:6379> DEL haicoder hicoder coder (integer) 3

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

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

Redis ZINTERSTORE命令总结

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

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