2012-05-08 15 views
18

Si supponga di avere un set (o un set ordinato o un elenco se ciò sarebbe migliore) A da 100 a 1000 stringhe.Redis: come intersecare un set "normale" con un set ordinato?

Quindi ho un set ordinato B di molte stringhe, diciamo un milione.

Ora C dovrebbe essere l'intersezione di A e B (delle stringhe, naturalmente).

Voglio avere ogni tupla (X, SCORE_OF_X_IN_B) dove X è in C.

Qualche idea?

Ho due idee:

  1. Interstore
    • memorizzare un un insieme ordinato di ogni partitura in oggetto 0
    • Interstore a D
    • ottenere ogni elemento di D
    • eliminare D
  2. semplice ciclo client
    • ciclare su un mio cliente in programma
    • get Zscore per ogni stringa

Mentre 1. ha modo troppo in alto sul lato Redis (deve scrivere per esempio. La pagina redis indica una complessità abbastanza alta, anche http://redis.io/commands/zinterstore), 2. avrebbe | A | connessioni al database e non sarà una buona scelta.

Forse avrei potuto scrivere uno script Redis/lua che funzionerà come Zscore, ma con un numero arbitrario di stringhe, ma non sono sicuro se il mio hoster consente agli script ...

così ho voluto solo chiedere COSÌ, se c'è una soluzione elegante e veloce disponibile senza scripting!

risposta

32

C'è una soluzione semplice al tuo problema: ZINTERSTORE funzionerà con uno SET e uno ZSET. Prova:

redis> sadd foo a 
(integer) 1 
redis> zadd bar 1 a 
(integer) 1 
redis> zadd bar 2 b 
(integer) 1 
redis> zinterstore baz 2 foo bar AGGREGATE MAX 
(integer) 1 
redis> zrange baz 0 -1 withscores 
1) "a" 
2) "1" 

Edit: ho aggiunto AGGREGATE MAX sopra, dal momento redis daranno ogni membro della (non ordinato) impostato foo un punteggio di default di 1, e SUM che con qualsiasi punteggio che ha nel (ordinato) impostato bar.

+2

Questo è quasi esattamente ciò che ho scritto nella mia domanda (vedi sopra, punto 1). Ho anche scritto che giudico questa soluzione troppo lenta. Nota Ho chiesto una soluzione elegante e veloce, non una semplice! Non sapevo che potevi fare uno zinterstore diretto con un set e un set ordinato. Grazie per la tua risposta e mi dispiace per aver scelto ovviamente un titolo sbagliato ... – user562529

Problemi correlati