Функцията, към която се свърза Eli, ви позволява да слушате, когато ключът изтече. Това обаче не ви дава стойността на ключа. Освен това, въз основа на подадения проблем с github, не изглежда, че можете да очаквате тази функция да бъде вградена скоро, ако изобщо някога (https://github.com/antirez/redis/issues/1876). Решението, което използвам, е да създам специален "сенчевен" ключ за изтичане, който е свързан с ключа, където имате действителна стойност.
Така че да приемем, че имате ключ, наречен testkey
и има целочислена стойност от 100
. Освен това, ключът ще изтече след 10 секунди, в който момент искате да получите стойността на ключа. (Може би сте увеличавали ключа през 10-те секунди, в които е съществувал).
Първо трябва да настроите прослушване за събития с ключово пространство. По-специално искате да слушате за expired
събития. Можете да направите това от вашата конфигурация или да използвате config set
команда в redis. (вижте тук за повече информация:http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
Сега можете да се абонирате за специално keyevent
канал, където ще бъдете уведомени, че ключът е изтекъл.
SUBSCRIBE [email protected]__:expired
Форматът на канала, за който да се абонирате, е [email protected]<db>__:<eventName>
. В нашия пример приемаме, че работим с базата данни по подразбиране 0 и искаме да чуем за expired
събитие.
Когато testkey
изтича, сега ще получите съобщение в __keyevent__
канал, където съобщението е името на ключа, който е изтекъл. Разбира се в този момент ключът е изчезнал, така че вече нямаме достъп до стойността! Решението е да използвате специален ключ за изтичане.
Когато създадете своя testkey
също така създайте специален ключ "shadow" с изтичащ срок (не изтичайте действителния testkey
). Например:
SET testkey 100
SET shadowkey:testkey "" EX 10
Сега в [email protected]__:expired
канал ще получите съобщение, което ви казва, че ключът shadowkey:testkey
просрочен. Вземете стойността на съобщението (което е името на ключа), разделете на двоеточие (или какъвто и да е разделител, който решите да използвате) и след това ръчно вземете стойността на ключа и го изтрийте.
// 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
Имайте предвид, че стойността на shadowkey-а не се използва, така че искате да използвате най-малката възможна стойност, която според този отговор (ключ за съхранение на Redis без стойност) е празен низ ""
. Това е малко повече работа за настройка, но горната система прави точно това, от което се нуждаете. Режийните разходи са няколко допълнителни команди за действително извличане и изтриване на вашия ключ плюс разходите за съхранение на празен ключ.