Redis 的 ZINTERSTORE 命令用于计算给定的一个或多个 有序集 的交集,其中给定 KEY 的数量必须以 numKEYs 参数指定,并将该交集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和。
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 选项,可以为每个给定有序集分别指定一个乘法因子,每个给定有序集的所有成员的 score 值在传递给聚合函数之前都要先乘以该有序集的因子。
如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。
使用 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 即是给第二个集合 。
使用 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 命令用于计算给定的一个或多个有序集的交集,其中给定 KEY 的数量必须以 numKEYs 参数指定,并将该交集(结果集)储存到 destination 。Redis ZINTERSTORE 命令语法:
192.168.98.70:6379> ZINTERSTORE destination numKEYs KEY [KEY ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]