2012-08-07 9 views
12

Mein redis Serverschlüssel nicht löschen, wenn die Time-to-Live-0 erreichtmeine redis Schlüssel verfallen nicht

Hier ist ein Beispielcode:

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" 

Wenn ich die Info Rückkehr überprüfen, indem Sie redis, es sagt 0 Schlüssel waren abgelaufen.

Irgendeine Idee?

danke.

Antwort

19

Da Sie ein "..." tun, ist es schwer zu sagen, aber ich würde sagen, Sie setzen mykey während dieses Teils, der das Ablaufdatum effektiv entfernen wird.

From the EXPIRE manual

Der Timeout wird nur dann gelöscht, wenn der Schlüssel entfernt wird, um die DEL Befehl oder überschrieben mit dem SET unter Verwendung oder GetSet Befehle

Also, regarding the -1 reply from TTL

Rückgabewert

Ganzzahlige Antwort: TTL in Sekunden oder -1, wenn der Schlüssel nicht vorhanden ist oder keine Zeitüberschreitung aufweist.

EDIT: Beachten Sie, dass dieses Verhalten in Redis geändert 2,8

Beginnend mit Redis 2.8 der Rückgabewert im Fehlerfall geändert:
Der Befehl gibt -2, wenn der Schlüssel nicht vorhanden ist .
Der Befehl gibt -1 zurück, wenn der Schlüssel vorhanden ist, aber kein zugeordnetes Ablaufen hat.

Mit anderen Worten, wenn Ihr Schlüssel existiert, scheint er persistent zu sein, dh er hat kein Ablaufdatum.

EDIT: Es scheint, ich kann dies reproduzieren, wenn ich den Schlüssel auf einem REDIS-Slave-Server erstellen, wird der Slave den Schlüssel nicht ohne Master-Eingang löschen, da normalerweise Sie nicht Schlüssel lokal auf einem Slave erstellen würden. Ist das hier der Fall?

jedoch während der Slaves an einen Master angeschlossen werden nicht unabhängig Tasten ablaufen (aber warten, bis die DEL vom Master kommen), sie nehm noch den vollen Zustand der im -Datensatz vorhandenen abläuft Wenn also ein Slave zu einem Master gewählt wird, kann er die Schlüssel unabhängig voneinander ablaufen lassen und vollständig als Master fungieren.

+0

Danke für Ihre so schnelle Antwort. Das "..." in meinem Snippet bedeutete nur, dass ich 20 Sekunden warten würde, bis die TTL -1 zurückgibt. Ich gebe hier keinen Befehl ein. Also sollte die Ausatmung bis zu ihrem Ende gehen, nein? – user1151446

+0

@ user1151446 Siehe meine Bearbeitung. –

+0

danke Joachim! Das ist genau der Punkt, an dem ich unabsichtlich meinen Schlüssel anstelle des Masters auf den Slave setze, was inkonsistent ist. Wenn ich zu meinem Master wechsle funktioniert alles gut. – user1151446