2014-11-02 17 views
5

Wie erhalte ich die meisten gewichteten Elemente aus einer sortierten Menge, aber ohne die in einer anderen Menge (oder Liste oder Hash) gefundenen Elemente.So erhalten Sie DIFF bei sortierter Menge

>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 

ist meine einzige Option ist ein-by-one Set Elemente aus der zu sortier erhalten und in die Liste der „disabled“ Artikel miteinander vergleichen? Wäre das nicht sehr langsam wegen so vieler Transaktionen zu einem Server?

Was ist der Ansatz hier?

Antwort

17

Anmerkung: Ich nehme an, Sie sadd disabled two

gemeint habe Wie Sie herausgefunden haben, SDIFF nicht auf sortierten Sets funktioniert - das ist die Differenz zwischen sortierten Sätzen nicht trivial, weil die Definition ist.

Was Sie tun können, ist zunächst einen temporären Satz mit ZUNIONSTORE erstellen und die Noten des intersect auf 0. Dann eine Reihe tun, um die 0 ausgenommen, z.B .:

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

Cooler Trick, Itamar! – djanowski

+0

@djanowski danke :) hoffe auf der #RedisConf 2016 wieder zu treffen! –

Verwandte Themen