Как ограничить количество элементов в отсортированных наборах Redis
В моем случае я загружаю много записей в отсортированный набор Redis, но мне нужно хранить только 10 самых высоко оцененных элементов. У меня нет возможности влиять на загружаемые данные (сортировать и ограничивать их перед загрузкой).
В настоящее время я просто выполняю
ZREMRANGEBYRANK key 0 -11
после завершения загрузки, но такой подход выглядит не очень оптимальным (он медленный и будет лучше, если Redis сможет справиться с этим).
Так предоставляет ли Redis что-то из коробки, чтобы ограничить количество элементов в отсортированных наборах?
1 ответ
Нет, Redis не предоставляет никакой такой функциональности, кроме ZREMRANGEBYRANK .
Существует аналогичная проблема с сохранением списка повторного отображения постоянного размера, скажем, 10 элементов, только когда элементы выталкиваются слева с помощью LPUSH.
Решение заключается в оптимизации процесса обрезки.
Усекать ваш отсортированный набор, время от времени, не каждый раз
Методы:
Запускайте ZREMRANGEBYRANK с вероятностью 1/5 каждый раз, используя случайное целое число.
Чтобы добиться этого, используйте конвейер redis или сценарии Lua, это даже спасло бы два сетевых вызова, происходящих почти при каждом 5-м вызове.
Это достаточно оптимально для упомянутой цели.
Пример алгоритма:
ZADD key member1 score1
random_int = some random number between 1-5
if random_int == 1: # trim sorted set with 1/5 chance
ZREMRANGEBYRANK key 0 -11