Управление TTL с помощью отсортированных членов Redis - PullRequest
0 голосов
/ 02 февраля 2019

Я делаю настройку автозаполнения и изучаю использование отсортированных наборов redis.Об этом довольно много документации, но суть заключается в добавлении префиксов, например, abc ZADD mySet - 0 a, 0 ab, 0 abc, 0 abc*.

Тогда какзапросы используются ZRANK для запроса, затем на основе этого используйте ZRANGE для получения соответствующих результатов.

В любом случае я хочу реализовать TTL не для набора, а для конкретных членовнабор.Я знаю, что это невозможно из коробки в Redis, поэтому я смотрю на реализацию альтернативного решения.Одним из вариантов является использование метки времени в качестве ранга, но это не сработает при автозаполнении, поскольку ранг имеет значение, для лексикографической сортировки им нужно иметь одинаковый балл.

Решение, которое я думаю, состоит в том, чтобы эффективнореплицировать отсортированный набор в несортированный набор.Это будет хранить значения, такие как <prefix>:timestamp.Затем по расписанию можно получить членов здесь, проверить время, удалить из отсортированного набора, если истек.Очевидно, это увеличивает использование памяти, но это подходит.

Мой вопрос: есть ли лучшие способы сделать это?С точки зрения масштаба и или простоты.Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

@ Итамар Хабер ответит хорошо, но для этого нужен дополнительный Сортированный Набор.Чтобы уменьшить использование памяти, вы можете закодировать время истечения в элемент.Возьмем для примера решение лексикографические индексы :

Индекс

Предположим, вы хотите проиндексировать abc и истечь егов 1549161254 (метка времени Unix).Вы можете закодировать термин и метку времени как имя члена, разделив его \xFE, то есть abc\xFE1549161254.

ZADD set 0 "abc\xFE1549161254"

Запрос

Когда пользователь вводит ab , вы можете сделать запрос:

ZRANGEBYLEX set "[ab" "[ab\xFF"

Это вернет abc \ xFE1549161254 , затем вы можете разделить строку с помощью \xFE.Первая часть - это соответствующий элемент, а вторая часть - время истечения.Если срок его действия истек, удалите его из отсортированного набора, в противном случае верните его пользователю.

При таком решении вам не требуется дополнительный набор для сохранения TTL, и он должен быть более эффективным в использовании памяти.

0 голосов
/ 02 февраля 2019

Использование другого отсортированного набора для отслеживания TTL-подобных временных меток в виде оценок, периодического запроса или при каждом вызове для поиска и удаления префиксов с истекшим сроком действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...