Истечение срока действия Redis, утечка памяти по спецификации?

Redis предоставляет нам функции EXPIRE и TTL. Согласно документации, команда TTL может использоваться для различения несуществующего и просроченный ключ:

> SET foo 3
OK
> GET foo
"3"
> EXPIRE foo 5
(integer) 1
> TTL foo
(integer) 3
> TTL foo
(integer) 2
> TTL foo
(integer) 1
> TTL foo
(integer) 0
> TTL foo
(integer) -2

Согласно спецификации EXPIRE, просроченные объекты фактически удаляются из хранилище либо при доступе к ним, либо через периодический случайный выбор ключей с истекшим сроком действия:

В частности, это то, что Redis делает 10 раз в секунду:

Протестируйте 20 случайных ключей из набора ключей с соответствующим сроком действия.

Удалите все найденные ключи с истекшим сроком действия.

Если срок действия более 25 ключей истек, начните снова с шага 1.

Но как насчет -2 (или информации, позволяющей генерировать ее вместо -1)? Хранится ли он навсегда или существует политика сбора мусора?

Также обратите внимание, что если мы установим и удалим новое значение для того же ключа, -2 сохранится:

> SET foo 3
OK
> ttl foo
(integer) -1
> del foo
(integer) 1
> ttl foo
(integer) -2

Так, например, предположим, что у нас есть скрипты, которые продолжают устанавливать ключи с инкрементными именами и заставляют их истекать через 1 секунду. Собираемся ли мы исчерпать память через сколь угодно долгое время?


person Dacav    schedule 10.04.2015    source источник


Ответы (2)


См. страницу Redis как наименее используемый кэш — вы можете запретить Redis превысить установленный объем памяти и выбрать одну из нескольких политик истечения срока действия и очистки ключа.

Тонкая проблема заключается в том, что не все типы данных в Redis хорошо работают с этим, но наборы с установленным ttl должны работать. Существует также поддержка достаточного количества журналов, чтобы вы могли отслеживать, что происходит, почему и как, когда вы настраиваете это.

person Dirk Eddelbuettel    schedule 10.04.2015

А как насчет -2 (или информации, позволяющей генерировать ее вместо -1)? Хранится ли он навсегда или существует политика сбора мусора?

-2 указывает, что ключа нет в базе данных, например:

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> ttl somekey
(integer) -2
person Itamar Haber    schedule 10.04.2015
comment
да. В этом суть. Вопрос был о том, как избавиться от -2, потому что, если мы аккумулируем -2 для бесконечных ключей, мы исчерпаем нашу память. Очень медленно, конечно. - person Dacav; 11.04.2015
comment
Для этого не требуется дополнительной памяти - в этом отношении она эквивалентна EXISTS. - person Itamar Haber; 11.04.2015
comment
Что ж, у нас уже есть ответ, но... Как ему не нужна дополнительная память? Где-то должна быть структура данных, которая запоминает, какие клавиши были связаны с таймером, иначе как система могла бы вспомнить, куда поставить -2? С точки зрения реализации, в Redis я ожидаю, что где-то существует какая-то структура, подобная словарю, и ключ с истекшим сроком действия использует его слот. - person Dacav; 11.04.2015
comment
-2 означает, что ключ не существует - он либо просрочен, либо никогда не создавался (см. пример в моем ответе). - person Itamar Haber; 12.04.2015
comment
Знал, что это произойдет, если я настоял ;) Иди и нанеси настоящий ущерб сейчас! - person Itamar Haber; 13.04.2015