2013-05-20 18 views
5

Qualcuno ha implementato una struttura dati limitata di qualsiasi tipo in Redis? Sto lavorando alla costruzione di qualcosa come un feed di notizie. Il feed finirà per essere manipolato e letto molto spesso, e tenerlo in un set ordinato in Redis sarebbe economico e perfetto per il mio caso d'uso. L'unico problema è che ho sempre bisogno di n elementi per feed e sono preoccupato per l'overflow della memoria, quindi mi piacerebbe assicurarmi che ogni feed non superi mai n elementi. Sembra abbastanza banale per fare una raccolta differenziata ricoperto in Redis con Lua:Redis limitato Ordinato Set, Elenco o Coda?

redis-cli EVAL "$(cat update_feed.lua)" 1 feeds:some_feed "thing_to_add", n 

Dove update_feed.lua sembra qualcosa di simile (senza prove):

redis.call('ZADD', KEYS[1], os.time(), ARGV[1]) 
local num = redis.call('ZCARD', KEYS[1]) 
if num > ARGV[2]: 
    redis.call('ZREMRANGEBYRANK', KEYS[1], -n, -inf) 

Che non è affatto male, ed abbastanza a buon mercato, ma sembra una cosa così basilare che potrebbe essere fattibile molto più a buon mercato istanziando il set ordinato con solo n bucket per cominciare. Non riesco a trovare un modo per farlo in redis, quindi credo che la mia domanda è: mi sono perso qualcosa, e se non l'ho fatto, perché non c'è una struttura per questo in redis, anche se ha appena eseguito il Lua di base script che ho descritto, sembra che sarebbe un tipico caso d'uso che dovrebbe essere implementato come opzione per le strutture di dati redis?

+1

Aggiungere l'elemento e tagliare la struttura dati utilizzando gli script Lua oi blocchi MULTI/EXEC è ciò che si suppone di fare. Non esiste un'opzione specifica per farlo automaticamente. –

+0

@DidierSpezia puoi aggiungerlo come risposta, quindi posso accettarlo? – Eli

+0

Devi accettare la risposta di gkamal, mi sembra a posto. –

risposta

15

È possibile utilizzare LTRIM se si tratta di un elenco.

Estratto dalla documentazione.

LPUSH mylist someelement 
LTRIM mylist 0 99 

Questa coppia di comandi spingeranno un nuovo elemento della lista, facendo attenzione che l'elenco non crescerà superiori a 100 elementi. Questo è molto utile quando si usa Redis per memorizzare i registri, per esempio. È importante notare che quando usato in questo modo LTRIM è un'operazione O (1) perché nel caso medio un solo elemento viene rimosso dalla coda della lista.

+0

L'intera sezione viene estratta dalla documentazione redis ufficiale :-) – gkamal

1

Io uso set me ordinati per questo. Anch'io ho pensato di usare le liste, ma poi ho scoperto che manipolare l'interno di una lista è piuttosto costoso - O (n) - mentre manipolare l'interno di un insieme ordinato è O (log n).

Questo è ciò che ha suggellato l'accordo per me: riuscirai mai a manipolare l'interno del set? In tal caso, segui i set ordinati e risciacquando il più vecchio ogni volta che devi, proprio come stavi pensando.

Problemi correlati