Ответ 1
Функция, с которой связан 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
, также создайте специальный истекающий "теневой" ключ (срок действия 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 сохраняет ключ без значения) является пустой строкой ""
. Это немного больше работы по настройке, но вышеуказанная система делает именно то, что вам нужно. Накладные расходы - это несколько дополнительных команд для фактического извлечения и удаления ключа плюс стоимость хранения пустого ключа.