Funktionen som Eli länkade till låter dig lyssna när en nyckel går ut. Det ger dig dock inte nyckelns värde. Baserat på det inlämnade github-problemet ser det inte ut som att du kan förvänta dig att ha den här funktionen inbyggd när som helst snart om någonsin (https://github.com/antirez/redis/issues/1876). Lösningen jag använder är att skapa en speciell "skugg"-utgångsnyckel som är länkad till nyckeln där du har ett verkligt värde.
Så låt oss säga att du har en nyckel som heter testkey
och den har ett heltalsvärde på 100
. Dessutom kommer nyckeln att förfalla efter 10 sekunder vid vilken tidpunkt du vill få värdet på nyckeln. (Kanske du ökade nyckeln under de 10 sekunder den fanns).
Först måste du ställa in lyssning för keyspace-händelser. I synnerhet vill du lyssna efter expired
evenemang. Du kan göra detta från din config eller använda config set
kommando i redis. (se här för mer info:http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
Nu kan du prenumerera på en speciell keyevent
kanal där du kommer att meddelas att nyckeln har gått ut.
SUBSCRIBE [email protected]__:expired
Formatet för kanalen att prenumerera på är [email protected]<db>__:<eventName>
. I vårt exempel antar vi att vi arbetar med standarddatabasen 0 och vi vill lyssna efter den expired
händelse.
När testkey
går ut får du nu ett meddelande i __keyevent__
kanal där meddelandet är namnet på nyckeln som har gått ut. Naturligtvis vid det här laget är nyckeln borta så vi kan inte längre komma åt värdet! Lösningen är att använda en speciell utgångsnyckel.
När du skapar din testkey
skapa även en speciell "skugg"-nyckel som löper ut (slut inte ut den faktiska testkey
). Till exempel:
SET testkey 100
SET shadowkey:testkey "" EX 10
Nu i [email protected]__:expired
kanal kommer du att få ett meddelande som talar om att nyckeln shadowkey:testkey
utgånget. Ta värdet på meddelandet (som är namnet på nyckeln), dela på kolon (eller vilken avgränsare du bestämmer dig för att använda) och hämta sedan värdet på nyckeln manuellt och ta bort den.
// 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
Observera att värdet på shadowkey inte används så du vill använda minsta möjliga värde som enligt detta svar (Redis store nyckel utan värde) är en tom sträng ""
. Det är lite mer jobb att installera men ovanstående system gör precis vad du behöver. Overheaden är några extra kommandon för att faktiskt hämta och radera din nyckel plus lagringskostnaden för en tom nyckel.