一尘不染

如何获得排序集上的DIFF

redis

如何从排序集中获得最加权的元素,但不包括在另一个集合(或列表或哈希)中找到的那些元素。

>zadd all 1 one
>zadd all 2 two
>zadd all 3 three
>sadd disabled 2
>sdiff all disabled

(error) WRONGTYPE Operation against a key holding the wrong kind of value

我唯一的选择是一对一地从排序集中获取元素并与“禁用”项目列表进行比较吗?由于与服务器的事务如此之多,这不会很慢吗?

这里的方法是什么?


阅读 340

收藏
2020-06-20

共1个答案

一尘不染

注意:我认为您的意思是 sadd disabled two

如您所知,SDIFF它不能对已排序的集合进行操作-这是因为定义已排序的集合之间的差异并不容易。

您可以做的是首先使用ZUNIONSTORE创建一个临时集,并将相交的得分设置为0。然后执行一个排除0的范围,例如:

127.0.0.1:6379> ZADD all 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> SADD disabled two
(integer) 1
127.0.0.1:6379> ZUNIONSTORE tmp 2 all disabled WEIGHTS 1 0 AGGREGATE MIN
(integer) 3
127.0.0.1:6379> ZREVRANGEBYSCORE tmp +inf 1 WITHSCORES
1) "three"
2) "3"
3) "one"
4) "1"
2020-06-20