2012-08-07 14 views
12

Il mio server Redis non elimina le chiavi quando il time-to-live raggiunge 0.mie chiavi Redis non scadono

Ecco un esempio di codice:

redis-cli 
>SET mykey "ismykey" 
>EXPIRE mykey 20 
#check TTL 
>TTL mykey 
>(integer) 17 
> ... 
>TTL mykey 
>(integer) -1 
#mykey chould have expired: 
>EXISTS mykey 
>(integer) 1 
>#oh still there, check its value 
>GET mykey 
>"ismykey" 

se controllo le informazioni di ritorno da redis, dice che 0 chiavi sono scadute.

Qualche idea?

grazie.

risposta

19

Dato che stai facendo un '...' è difficile dirlo con certezza, ma direi che stai impostando mykey durante quella parte, che rimuoverà efficacemente la scadenza.

From the EXPIRE manual

Il timeout viene cancellato solo quando la chiave viene rimossa utilizzando il comando DEL o sovrascritto usando il SET o comandi GetSet

Also, regarding the -1 reply from TTL

Valore restituito

Risposta intera: TTL in secondi o -1 quando la chiave non esiste o non ha un timeout.

EDIT: Si noti che questo comportamento è cambiato in Redis 2,8

Partendo Redis 2.8 il valore di ritorno in caso di errore è cambiato:
Il comando restituisce -2 se la chiave non esiste .
Il comando restituisce -1 se la chiave esiste ma non è associata alla scadenza.

In altre parole, se la vostra chiave esiste, sembrerebbe essere persistente, cioè non avere alcuna scadenza impostata.

EDIT: Sembra che posso riprodurre questo se creo la chiave su un server slave REDIS, lo schiavo non eliminare la chiave senza input padrone, dal momento che normalmente non sarebbe creare chiavi localmente su uno schiavo. È questo il caso qui?

Tuttavia mentre gli slave collegati ad un master non scadono chiavi indipendente (ma attenderà il DEL proveniente dal master), sarà ancora prendere lo stato completo del scade esistente nel set di dati quindi, quando uno schiavo viene eletto su un master, sarà in grado di di scartare le chiavi in ​​modo indipendente, agendo completamente come un master.

+0

Grazie per la risposta così rapida. Il "..." nel mio frammento indicava solo che aspetto 20 secondi finché TTL non restituisce -1. Non scrivo alcun comando qui. Quindi la scadenza dovrebbe andare fino alla fine, no? – user1151446

+0

@ user1151446 Vedere la mia modifica. –

+0

grazie Joachim! Questo è esattamente il punto, ho involontariamente impostato la mia chiave sullo schiavo invece che sul master, il che è incoerente. Se passo al mio padrone, tutto funziona bene. – user1151446

Problemi correlati