Redis
 sql >> Database >  >> NoSQL >> Redis

Redis:per impostare il timeout per una coppia di valori chiave in Set

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

Tuttavia, puoi implementare la tua logica per ottenere quel risultato. Esistono diversi approcci possibili per affrontare questo problema:ecco un esempio. Invece di usare un set, usa un set ordinato (ZSET) e imposta il punteggio di ogni membro sul suo tempo di scadenza usando i valori epoch. Questo tipo di flusso di lavoro potrebbe essere implementato utilizzando ad esempio uno script Lua. Per aggiungere membri usa qualcosa come:

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

ed EVAL usando "1 a 60 1" e "1 a 120 2" come argomenti, secondo il tuo esempio. Per "scadenzare" effettivamente gli oggetti dal set, dovrai eliminarli una volta trascorso il loro tempo. Puoi farlo implementando un processo periodico che scansiona il tuo elenco o accedendovi. Ad esempio, il seguente Lua può essere utilizzato per far scadere i membri:

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

e EVAL usando '1 a' come argomenti per il tuo esempio.

EDIT:come ottenere quanto sopra usando 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')