2014-11-02 2 views
5

Come ottengo gli elementi più ponderati da un set ordinato, escludendo quelli trovati in un altro set (o elenco o hash).Come ottenere DIFF sul set ordinato

>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 

è la mia unica opzione è quella di ottenere elementi dal set ordinato uno per uno e confrontare l'elenco delle voci "disabili"? Non sarebbe molto lento a causa di così tante transazioni su un server?

Qual è l'approccio qui?

risposta

17

Nota: presumo che hai dire sadd disabled two

Come hai scoperto, SDIFF non opera su insiemi ordinati - è perché definisce la differenza tra le serie ordinate non è banale.

Che cosa si potrebbe fare è innanzitutto creare un insieme temporanea con ZUNIONSTORE e impostare i punteggi della intersezione a 0. Poi fare un intervallo escluso il 0, ad es .:

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

fresco trucco, Itamar! – djanowski

+0

@djanowski ringrazia :) sperando di incontrarci di nuovo a #RedisConf 2016! –