2014-11-02 11 views
5

Jak uzyskać większość ważonych elementów z posortowanego zestawu, ale z wyłączeniem tych znajdujących się w innym zestawie (lub liście lub haszowaniu).Jak uzyskać DIFF na posortowanym zbiorze

>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 

Czy moją jedyną opcją jest pobranie elementów z posortowanego zestawu jeden po drugim i porównanie z listą "wyłączonych" elementów? Czy nie byłoby to bardzo powolne z powodu tak wielu transakcji na serwerze?

Jakie jest podejście tutaj?

Odpowiedz

17

Uwaga: Zakładam, że masz na myśli sadd disabled two

Jak już dowiedzieliśmy, SDIFF nie działa na posortowanych zestawów - to dlatego, że zdefiniowanie różnicy między posortowanych zestawów nie jest trywialne.

Co można zrobić, to najpierw utworzyć tymczasowy zestaw z ZUNIONSTORE i ustawić wyniki Przeciecie do 0. Następnie wykonaj szereg wyłączeniem 0, np .:

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

super trik Itamar! – djanowski

+0

@djanowski dzięki :) mając nadzieję spotkać się ponownie na #RedisConf 2016! –

Powiązane problemy