Как ограничить количество элементов в отсортированных наборах Redis

В моем случае я загружаю много записей в отсортированный набор Redis, но мне нужно хранить только 10 самых высоко оцененных элементов. У меня нет возможности влиять на загружаемые данные (сортировать и ограничивать их перед загрузкой).

В настоящее время я просто выполняю

ZREMRANGEBYRANK key 0 -11

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

Так предоставляет ли Redis что-то из коробки, чтобы ограничить количество элементов в отсортированных наборах?

1 ответ

Решение

Нет, Redis не предоставляет никакой такой функциональности, кроме ZREMRANGEBYRANK .

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

Решение заключается в оптимизации процесса обрезки.

Усекать ваш отсортированный набор, время от времени, не каждый раз

Методы:

  1. Запускайте ZREMRANGEBYRANK с вероятностью 1/5 каждый раз, используя случайное целое число.

  2. Чтобы добиться этого, используйте конвейер 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
Другие вопросы по тегам