Met de functie waar Eli aan gekoppeld is, kun je luisteren wanneer een sleutel verloopt. Het geeft u echter niet de waarde van de sleutel. Bovendien lijkt het er op basis van het ingediende github-probleem niet op dat je kunt verwachten dat deze functie snel of ooit zal worden ingebouwd (https://github.com/antirez/redis/issues/1876). De oplossing die ik gebruik is om een speciale "schaduw"-verloopsleutel te maken die is gekoppeld aan de sleutel waar je een werkelijke waarde hebt.
Dus laten we zeggen dat je een sleutel hebt genaamd testkey
en het heeft een geheel getal van 100
. Bovendien verloopt de sleutel na 10 seconden, op welk punt u de waarde van de sleutel wilt krijgen. (Misschien verhoogde je de sleutel gedurende de 10 seconden dat deze bestond).
Eerst moet u het luisteren naar keyspace-gebeurtenissen instellen. In het bijzonder wil je luisteren naar expired
evenementen. U kunt dit doen vanuit uw configuratie of de config set
. gebruiken commando in redis. (zie hier voor meer info:http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
Nu kun je je abonneren op een speciaal keyevent
kanaal waar je een melding krijgt dat de sleutel is verlopen.
SUBSCRIBE [email protected]__:expired
De indeling van het kanaal waarop u zich wilt abonneren is [email protected]<db>__:<eventName>
. In ons voorbeeld gaan we ervan uit dat we werken met de standaarddatabase 0 en we willen luisteren naar de expired
evenement.
Wanneer de testkey
verloopt, krijgt u nu een bericht in de __keyevent__
kanaal waarbij het bericht de naam is van de sleutel die is verlopen. Natuurlijk is op dit punt de sleutel weg, dus we hebben geen toegang meer tot de waarde! De oplossing is om een speciale vervalsleutel te gebruiken.
Wanneer u uw testkey
aanmaakt maak ook een speciale verlopende "schaduw"-sleutel aan (verval niet de daadwerkelijke testkey
). Bijvoorbeeld:
SET testkey 100
SET shadowkey:testkey "" EX 10
Nu in het [email protected]__:expired
kanaal krijg je een bericht waarin staat dat de sleutel shadowkey:testkey
verlopen. Neem de waarde van het bericht (dat is de naam van de sleutel), splits op de dubbele punt (of welk scheidingsteken dan ook dat u besluit te gebruiken), en verkrijg vervolgens handmatig de waarde van de sleutel en verwijder deze.
// 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
Merk op dat de waarde van de schaduwsleutel niet wordt gebruikt, dus u wilt de kleinst mogelijke waarde gebruiken die volgens dit antwoord (Redis-winkelsleutel zonder waarde) een lege tekenreeks is ""
. Het is wat meer werk om in te stellen, maar het bovenstaande systeem doet precies wat je nodig hebt. De overhead is een paar extra opdrachten om uw sleutel daadwerkelijk op te halen en te verwijderen plus de opslagkosten van een lege sleutel.