如何在已排序的集合中获取差异(DIFF)

10

如何从已排序的集合中获取最有价值的元素,但不包括在另一个集合(列表或哈希表)中找到的元素。

>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

我的唯一选择是逐个从排序集合中获取元素并与“禁用”项目列表进行比较吗?这样做会因为向服务器发起太多事务而变得非常缓慢吗?

这里的方法是什么?

1个回答

30

注意:我假设你的意思是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"

@djanowski 谢谢 :) 希望在 #RedisConf 2016 再次见面! - Itamar Haber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接