2014-11-02 66 views
5

如何從排序集中獲取大多數加權元素,但排除在另一個集(或列表或散列)中找到的元素。如何獲得排序集上的DIFF

>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 

我唯一的選擇是從有序集合中逐個獲取元素,並與「禁用」項目列表進行比較?由於服務器的交易太多,會不會很慢?

這裏有什麼方法?

回答

17

注:我假設你的意思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" 
+1

酷招,伊塔馬爾! – djanowski 2016-03-10 19:58:21

+0

@djanowski謝謝:)希望再次見面#RedisConf 2016! – 2016-03-11 11:17:23