Die Funktion, mit der Eli verknüpft ist, ermöglicht es Ihnen, zuzuhören, wenn ein Schlüssel abläuft. Es gibt Ihnen jedoch nicht den Wert des Schlüssels. Darüber hinaus sieht es basierend auf dem eingereichten Github-Problem nicht so aus, als ob Sie erwarten können, dass diese Funktion in absehbarer Zeit eingebaut wird, wenn überhaupt (https://github.com/antirez/redis/issues/1876). Die Lösung, die ich verwende, besteht darin, einen speziellen "Schatten"-Ablaufschlüssel zu erstellen, der mit dem Schlüssel verknüpft ist, in dem Sie einen tatsächlichen Wert haben.
Nehmen wir also an, Sie haben einen Schlüssel namens testkey
und es hat einen ganzzahligen Wert von 100
. Außerdem läuft der Schlüssel nach 10 Sekunden ab, an welchem Punkt Sie den Wert des Schlüssels erhalten möchten. (Vielleicht haben Sie den Schlüssel während der 10 Sekunden, in denen er existierte, erhöht).
Zuerst müssen Sie das Abhören von Keyspace-Ereignissen einrichten. Insbesondere möchten Sie auf expired
lauschen Veranstaltungen. Sie können dies von Ihrer Konfiguration aus tun oder das config set
verwenden Befehl in redis. (Weitere Informationen finden Sie hier:http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
Jetzt können Sie ein spezielles keyevent
abonnieren Kanal, in dem Sie benachrichtigt werden, dass der Schlüssel abgelaufen ist.
SUBSCRIBE [email protected]__:expired
Das Format des zu abonnierenden Kanals ist [email protected]<db>__:<eventName>
. In unserem Beispiel gehen wir davon aus, dass wir mit der Standarddatenbank 0 arbeiten und auf expired
lauschen wollen Veranstaltung.
Wenn der testkey
abläuft erhalten Sie nun eine Meldung im __keyevent__
Channel, wobei die Nachricht der Name des abgelaufenen Schlüssels ist. An diesem Punkt ist der Schlüssel natürlich weg, sodass wir nicht mehr auf den Wert zugreifen können! Die Lösung besteht darin, einen speziellen Ablaufschlüssel zu verwenden.
Wenn Sie Ihren testkey
erstellen Erstellen Sie auch einen speziellen ablaufenden "Schatten"-Schlüssel (lassen Sie den eigentlichen testkey
nicht ablaufen ). Zum Beispiel:
SET testkey 100
SET shadowkey:testkey "" EX 10
Jetzt im [email protected]__:expired
Kanal erhalten Sie eine Meldung, die Ihnen mitteilt, dass der Schlüssel shadowkey:testkey
abgelaufen. Nehmen Sie den Wert der Nachricht (das ist der Name des Schlüssels), teilen Sie ihn mit dem Doppelpunkt (oder einem beliebigen Trennzeichen, das Sie verwenden möchten) und rufen Sie dann den Wert des Schlüssels manuell ab und löschen Sie ihn.
// set your key value
SET testkey 100
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:testkey "" EX 10
// Get an expiration message in the channel [email protected]__:expired
// Split the key on ":", take the second part to get your original key
// Then get the value and do whatever with it
GET testkey
// Then delete the key
DEL testkey
Beachten Sie, dass der Wert des Shadowkeys nicht verwendet wird, also möchten Sie den kleinstmöglichen Wert verwenden, der laut dieser Antwort (Redis Store Key ohne Wert) eine leere Zeichenfolge ""
ist . Die Einrichtung ist etwas aufwändiger, aber das obige System macht genau das, was Sie brauchen. Der Overhead besteht aus ein paar zusätzlichen Befehlen, um Ihren Schlüssel tatsächlich abzurufen und zu löschen, plus den Speicherkosten eines leeren Schlüssels.