Подтвердить что ты не робот

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). Есть ли более "внутренний" способ?

4b9b3361

Ответ 1

Невозможно напрямую уничтожить элементы в списке, наборах или zsets.

Вам необходимо внедрить механизм, который будет уведомляться, когда истекает срок действия основного элемента, поэтому вы можете соответствующим образом поддерживать соответствующие наборы.

См. ответ на этот вопрос, я думаю, что он применим к вашему варианту использования (замените сеанс по id и пользователю по тегу):

Redis, окончание сеанса и обратный поиск

Ответ 2

Нет, это невозможно (и не планируется). Подход рекомендуется использовать для упорядоченного набора с баром, установленным на отметку времени, а затем вручную удалять истекшие ключи. Чтобы запросить ключи без истечения срока действия, вы можете использовать ZRANGEBYSCORE $now +inf, чтобы удалить истекшие ключи, ZREMRANGEBYSCORE -inf $now выполнит трюк.

В моем приложении я просто выдаю обе команды каждый раз, когда я запрашиваю набор. Я также совмещаю это с (длинным) временем истечения на самом наборе, чтобы в конечном счете очистить неиспользуемые наборы.

Эта статья более подробно описывает ее.