redis ZINTERSTORE详解

Posted zxqblogrecord

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis ZINTERSTORE详解相关的知识,希望对你有一定的参考价值。

command 语法:
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]

command 意义:
ZINTERSTORE ~ 命令关键字
destination ~指定结果集保存的集合key
numkeys key [key …] ~ numkeys 指定有多少个集合参与交集运算, key 指定参与交集运算的集合的key
[WEIGHTS weight [weight …]] ~ 指定参与交集运算各集合score的权重参数
[AGGREGATE SUM|MIN|MAX] ~ 指定交集中元素的score的取值方式,例如:sum 等于各集合中该元素的score乘以权重求和
注:
1 默认情况下:权重皆为1 ,取值方式为 sum
2 若指定的destination已经存在,则结果集会覆盖这个key ,无论之前这个key是什么类型,是否包含元素,使用时务必注意

详细解释:

  Redis Zinterstore 命令计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。结果集中元素score为 取值方式计算各集合中该元素score乘以权重结果

#新增一个有序集合
127.0.0.1:6379> zadd zkey1 1 one 2 two 3 three 4 foure 5 five
(integer) 5
127.0.0.1:6379> zrange zkey1 0 -1 withscores
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "foure"
 8) "4"
 9) "five"
10) "5"

#新增一个有序集合
127.0.0.1:6379> zadd zkey2 10 one 20 two 60 six 70 seven
(integer) 4
127.0.0.1:6379> zrange zkey2 0 -1 withscores
1) "one"
2) "10"
3) "two"
4) "20"
5) "six"
6) "60"
7) "seven"
8) "70"

#取zkey1 和zkey2 2个有序集合的交集 保存至有序集合zkey3(zkey3若不存在则新建,若存在则覆盖)
127.0.0.1:6379> zinterstore zkey3 2 zkey1 zkey2 
(integer) 2
127.0.0.1:6379> zrange zkey3 0 -1 withscores
1) "one"
2) "11"
3) "two"
4) "22"

#取zkey1 和zkey2 2个有序集合的交集 保存至有序集合zkey3,权重配置为 10 和 1(zkey3若不存在则新建,若存在则覆盖)
# zkey3 score = (zkey1 score)*10 + (zkey2 score)*1 
# 例如 one score: 20 = 1*10+10*1
127.0.0.1:6379> zinterstore zkey3 2 zkey1 zkey2 weights 10 1
(integer) 2
127.0.0.1:6379> zrange zkey3 0 -1 withscores
1) "one"
2) "20"
3) "two"
4) "40"

# 没有指定numberkeys 
127.0.0.1:6379> zinterstore zkey3 zkey1 zkey2 aggregate min
(error) ERR value is not an integer or out of range

#取zkey1 和zkey2 2个有序集合的交集 保存至有序集合zkey3,取值方式为min(zkey3若不存在则新建,若存在则覆盖)
# zkey3 score = min( (zkey1 score)*1  , (zkey2 score)*1 )
# 例如 one score:1 = min(1,10)
127.0.0.1:6379> zinterstore zkey3 2 zkey1 zkey2 aggregate min
(integer) 2
127.0.0.1:6379> zrange zkey3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"

#测试 保存结果的key已经存在 实际覆盖这个key
#新增一个无序集合 setkey1
127.0.0.1:6379> sadd setkey1 1
(integer) 1
127.0.0.1:6379> smembers setkey1
 1) "1"
#取zkey1 和zkey2 2个有序集合的交集 保存至无序结合setkey1中
127.0.0.1:6379> zinterstore setkey1 2 zkey1 zkey2
(integer) 2
#setkey1 的类型从无序集合变为有序集合了 原有元素已经不存在了
127.0.0.1:6379> type setkey1
zset
127.0.0.1:6379> smembers setkey1 
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> zrange setkey1 0 -1 withscores
1) "one"
2) "11"
3) "two"
4) "22"
127.0.0.1:6379> 

--------------------- 
原文:https://blog.csdn.net/qq_37586182/article/details/80240728 










以上是关于redis ZINTERSTORE详解的主要内容,如果未能解决你的问题,请参考以下文章

当两个输入集之一是正常集时,zinterstore 会更快/更慢吗?

Jedis操作Redis--SortedSet类型

Jedis操作Redis--SortedSet类型

Jedis操作Redis--SortedSet类型 (会自然排序)

Redis学习之列表类型详解

redis数据结构