2014-06-08 11 views

risposta

6

Sfortunatamente, no. I "contenitori" di Redis (ad esempio elenchi, hash, set e serie ordinate) non supportano la scadenza per membro, sebbene questa funzionalità sia stata richiesta molte volte in passato.

È tuttavia possibile implementare la propria logica per ottenere tale risultato. Ci sono diversi possibili approcci per affrontare questo - ecco un esempio. Invece di usare un set, usa un set ordinato (ZSET) e imposta il punteggio di ogni membro al suo tempo di scadenza usando valori di epoca. Ad esempio, questo tipo di flusso di lavoro potrebbe essere implementato utilizzando uno script Lua. Per aggiungere membri utilizzano qualcosa come:

redis.call('zadd', KEYS[1], os.time()+ARGV[1], ARGV[2]) 

e EVAL utilizzando '1 60 1' e '1 120 2' come argomenti, secondo il vostro esempio. Per "scadere" effettivamente degli oggetti dal set, dovrai cancellarli una volta trascorso il loro tempo. Puoi farlo sia implementando un processo periodico che analizza il tuo elenco o all'accesso. Ad esempio, il seguente Lua può essere utilizzato per scadere membri:

redis.call('zremrangebyscore', KEYS[1], '-inf', os.time()) 

e EVAL utilizzando '1 bis' come argomenti per il vostro esempio.

EDIT: Come ottenere il sopra utilizzando Python

import time 
import redis 

def add(r, key, ttl, member): 
    r.zadd(key, member, int(time.time()+ttl)) 

def expire(r, key): 
    r.zremrangebyscore(key, '-inf', int(time.time())) 

... 

r = redis.Redis() 
add(r, 'a', 1, 60) 
add(r, 'a', 2, 120) 

# periodically or before every operation do 
expire(r, 'a') 
+0

Grazie molto per la vostra spiegazione, c'è un esempio su come raggiungere questo obiettivo utilizzando Python. – user3218088

+0

Aggiunto un po 'di codice Python (non verificato però) - speriamo che questo ti renderà più facile l'implementazione :) –

+0

... e grazie per le modifiche - ti ha detto che non è stato testato;) –

Problemi correlati