如何在排序集上获取DIFF

时间:2014-11-02 10:12:08

标签: 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

我唯一的选择是逐个从排序集中获取元素并与“禁用”项列表进行比较吗?由于对服务器的这么多交易,这不是很慢吗?

这里的方法是什么?

1 个答案:

答案 0 :(得分:24)

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