EXPIRE
EXPIRE
EXPIRE key seconds [NX | XX | GT | LT]
- Доступно с версии:
- 1.0.0
- Сложность по времени:
- O(1)
- Категории ACL:
-
@keyspace,@write,@fast,
Устанавливает таймаут для key. После истечения таймаута ключ будет автоматически удалён. Ключ с установленным таймаутом часто называют летучим в терминологии Redis.
Таймаут будет сброшен только командами, которые удаляют или перезаписывают содержимое ключа, включая DEL, SET, GETSET и все *STORE команды. Это означает, что все операции, которые концептуально изменяют значение, хранящееся в ключе, не заменяя его новым значением, оставят таймаут без изменений. Например, увеличение значения ключа с помощью INCR, добавление нового значения в список с помощью LPUSH или изменение значения поля хеша с помощью HSET — это все операции, которые не изменят таймаут.
Таймаут также можно сбросить, превратив ключ в постоянный ключ, с помощью команды PERSIST.
Если ключ переименовывается с помощью RENAME, связанное время жизни передается новому имени ключа.
Если ключ перезаписывается с помощью RENAME, как в случае с существующим ключом Key_A , который перезаписывается вызовом, подобным RENAME Key_B Key_A, то неважно, был ли у исходного ключа Key_A установлен таймаут или нет, новый ключ Key_A унаследует все характеристики Key_B.
Обратите внимание, что вызов EXPIRE/PEXPIRE с не положительным таймаутом или EXPIREAT/PEXPIREAT со временем в прошлом приведет к удалению ключа вместо истечения таймаута (соответственно, испущенное событие ключа будет del, а не expired).
Параметры
Команда EXPIRE поддерживает набор параметров:
-
NX— Устанавливает срок действия только при отсутствии срока действия ключа -
XX— Устанавливает срок действия только при наличии текущего срока действия ключа -
GT— Устанавливает срок действия только при условии, что новый срок действия больше текущего -
LT— Устанавливает срок действия только при условии, что новый срок действия меньше текущего
Не летучий ключ обрабатывается как бесконечный TTL для целей GT и LT. Параметры GT, LT и NX взаимоисключают друг друга.
Обновление истечений срока действия
Можно вызвать EXPIRE, используя в качестве аргумента ключ, у которого уже установлено истечение срока действия. В этом случае время жизни ключа обновляется до нового значения. Для этого есть много полезных применений, пример показан в разделе шаблона Сессия навигации ниже.
Отличия в Redis до версии 2.1.3
В версиях Redis до 2.1.3 изменение ключа с установленным сроком действия с помощью команды, изменяющей его значение, приводило к полному удалению ключа. Такое поведение было необходимо из-за ограничений в слое репликации, которые теперь устранены.
EXPIRE возвращало бы 0 и не изменяло бы таймаут ключа с установленным таймаутом.
Возвращаемое значение
Целочисленный ответ, а именно:
-
1если таймаут был установлен. -
0если таймаут не был установлен. Например, ключ не существует или операция пропущена из-за предоставленных аргументов.
Примеры
SET mykey "Hello" EXPIRE mykey 10 TTL mykey SET mykey "Hello World" TTL mykey EXPIRE mykey 10 XX TTL mykey EXPIRE mykey 10 NX TTL mykey
Шаблон: Сессия навигации
Представьте себе веб-сервис, и вам интересно, какие последние N страниц недавно посещали ваши пользователи, при этом каждый последующий просмотр страницы был выполнен не более чем через 60 секунд после предыдущего. Концептуально вы можете рассматривать этот набор просмотров страниц как сессию навигации вашего пользователя, которая может содержать интересную информацию о том, какие продукты он или она сейчас ищет, чтобы вы могли рекомендовать связанные продукты.
Вы легко можете смоделировать этот шаблон в Redis, используя следующую стратегию: каждый раз, когда пользователь просматривает страницу, вы вызываете следующие команды:
MULTI RPUSH pagewviews.user:<userid> http://..... EXPIRE pagewviews.user:<userid> 60 EXEC
Если пользователь будет бездействовать более 60 секунд, ключ будет удален, и последующие просмотры страниц, которые произошли с разницей менее 60 секунд, будут записаны.
Этот шаблон легко изменить, чтобы использовать счётчики с помощью INCR вместо списков с помощью RPUSH.
Приложение: Redis истечения срока действия
Ключи с истечением срока действия
Обычно ключи Redis создаются без установленного срока действия. Ключ будет существовать вечно, пока он не будет удалён пользователем явно, например, с помощью команды DEL.
Семейство команд EXPIRE может установить срок действия для данного ключа за счёт использования дополнительной памяти для ключа. Когда для ключа установлен срок действия, Redis гарантирует, что ключ будет удалён, когда пройдёт указанное количество времени.
Время жизни ключа можно обновить или полностью удалить с помощью команд EXPIRE и PERSIST (или других тесно связанных команд).
Точность истечения срока действия
В Redis 2.4 срок действия может быть неточным и отличаться от запланированного значения на 0-1 секунду.
В Redis 2.6 погрешность истечения срока действия составляет от 0 до 1 миллисекунды.
Истечение срока действия и сохранение
Информация об истечении срока действия ключей хранится в виде абсолютных временных меток Unix (в миллисекундах в случае Redis версии 2.6 или выше). Это означает, что время продолжает идти даже когда экземпляр Redis не активен.
Для правильной работы истечения срока действия время компьютера должно быть стабильным. Если вы переместите файл RDB с двух компьютеров с большой разницей во времени, могут произойти странные вещи (например, все загруженные ключи могут истечь при загрузке).
Даже работающие экземпляры всегда проверяют время компьютера, поэтому, например, если вы устанавливаете ключ со сроком действия 1000 секунд, а затем устанавливаете время компьютера на 2000 секунд в будущем, ключ истечёт сразу, а не продержится 1000 секунд.
Как Redis истекает ключи
Ключи Redis истекают двумя способами: пассивно и активно.
Ключ истекает пассивно, когда какой-то клиент пытается получить к нему доступ, и оказывается, что срок действия ключа истек.
Конечно, этого недостаточно, так как есть ключи со сроком действия, которые больше никогда не будут обработаны. Эти ключи также должны истечь, поэтому Redis периодически проверяет несколько случайных ключей среди ключей с установленным сроком действия. Все ключи, срок действия которых истек, удаляются из пространства ключей.
В частности, вот что делает Redis 10 раз в секунду:
- Проверяет 20 случайных ключей из набора ключей с установленным сроком действия.
- Удаляет все обнаруженные истекшие ключи.
- Если более 25% ключей истекли, повторяет шаг 1.
Это тривиальный вероятностный алгоритм; основное предположение заключается в том, что наша выборка является представительной для всего пространства ключей, и мы продолжаем истекать, пока процент ключей, которые, вероятно, истекут, не станет меньше 25%.
Это означает, что в любой момент максимальное количество уже истекших ключей, использующих память, не может превышать максимальное количество операций записи в секунду, делённое на 4.
Как истечения срока действия обрабатываются в репликации и файле AOF
Для достижения правильного поведения без потери согласованности, при истечении срока действия ключа синтезируется операция DEL как в файле AOF, так и для всех связанных реплик. Таким образом, процесс истечения срока действия централизован в главном экземпляре, и нет возможности возникновения ошибок согласованности.
Однако, хотя реплики, подключенные к главному экземпляру, не будут истекать ключи независимо (но будут ждать DEL от главного экземпляра), они по-прежнему будут принимать полное состояние истечения срока действия в наборе данных, поэтому, когда реплика будет выбрана как главный экземпляр, она сможет истекать ключи независимо, полностью выполняя роль главного экземпляра.
История
- Начиная с версии Redis 7.0.0: добавлены опции:
NX,XX,GTиLT.
© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/expire/