TTL для заданного члена
Возможно ли в Redis установить TTL (время жизни) не для определенного ключа, а для члена для набора?
Я использую структуру для тегов, предложенную документацией Redis - данные представляют собой простые пары ключ-значение, а теги - это наборы, содержащие ключи, соответствующие каждому тегу, например.
> SETEX id:id_1 100 'Lorem ipsum'
OK
> SADD tag:tag_1 id:id_1
(integer) 1
Ключ id:id_1
истечет, как ожидалось, но я не вижу эффективного способа удалить соответствующий элемент из набора tag:tag_1
.
Один из способов, с помощью которого я пришел, - использовать задание cron, содержащее script, которое периодически удаляло бы истекшие ключи из наборов, добавляя все имена тегов в другой набор и затем повторяя все теги, а затем все идентификаторы, соответствующие каждый тег и проверка наличия соответствующего ключа - если нет, вызов SREM
.
Я не думаю, что это будет эффективный способ, и мне бы хотелось, чтобы теги были максимально чистыми, потому что размер наборов, вероятно, повлияет на производительность поиска по нескольким тегам (SINTER
). Есть ли более "внутренний" способ?
Ответы
Ответ 1
Невозможно напрямую уничтожить элементы в списке, наборах или zsets.
Вам необходимо внедрить механизм, который будет уведомляться, когда истекает срок действия основного элемента, поэтому вы можете соответствующим образом поддерживать соответствующие наборы.
См. ответ на этот вопрос, я думаю, что он применим к вашему варианту использования (замените сеанс по id и пользователю по тегу):
Redis, окончание сеанса и обратный поиск
Ответ 2
Нет, это невозможно (и не планируется). Подход рекомендуется использовать для упорядоченного набора с баром, установленным на отметку времени, а затем вручную удалять истекшие ключи. Чтобы запросить ключи без истечения срока действия, вы можете использовать ZRANGEBYSCORE $now +inf
, чтобы удалить истекшие ключи, ZREMRANGEBYSCORE -inf $now
выполнит трюк.
В моем приложении я просто выдаю обе команды каждый раз, когда я запрашиваю набор. Я также совмещаю это с (длинным) временем истечения на самом наборе, чтобы в конечном счете очистить неиспользуемые наборы.
Эта статья более подробно описывает ее.
Ответ 3
Вы не можете просрочить элементы в списке, но вы можете зарегистрировать скрипт lua на вашем сервере redis. Redis Срок действия основан на значении