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.
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
@ user1151446 Siehe meine Bearbeitung. –
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