Извлечение предметов по рангу из отсортированного в Redis набора (и обработка предметов, которые могут делиться рангами) - PullRequest
0 голосов
/ 23 апреля 2019

Я могу запросить повторно отсортированный набор по баллам (zrangebyscore), по значениям (zrange), по лексикографическому порядку (zrangebylex) и т. Д.

Но какой шаблон лучше всего использовать, если я хочу получить 10 лучших элементов из отсортированного набора redis?

Для меня это не равносильно извлечению 10 лучших предметов из отсортированного набора (т. Е. zrevrange set_name 0 10). Зачем? Потому что во многих реальных сценариях, когда определенные предметы имеют одинаковое количество очков, им соответственно присваивается общий ранг. Таким образом, мог бы быть список лучших 10 с 11 участниками (например).

Можно ли таким способом запрашивать ранги в отсортированном наборе redis?

Мой другой вариант - извлечь весь набор и выполнить подсчет за пределами redis. Я считаю, что это может быть неоптимальным для больших наборов, которые часто ранжируются.

Если это имеет значение, я использую redis в проекте Python.

1 Ответ

0 голосов
/ 23 апреля 2019

Вам нужен еще один отсортированный набор для ранжирования баллов, чтобы вы могли получить лучшие N баллов. С возвращенным диапазоном оценок вы можете использовать ZRANGEBYSCORE, чтобы получить список участников.

ADD

ZADD members 0 a 1 b 1 c 2 d 2 e 3 f

ZADD scores 0 0 1 1 2 2 2 2 3 3

ПОИСК

Получить участников с 3 лучшими баллами.

ZREVRANGE scores 0 2

// it returns '3, 2, 1' so the score range is [1, 2]

ZRANGEBYSCORE members 1 3

// you can get the result: b, c, d, e, f

Я оставляю часть DELETE как упражнение:)

Также проверьте этот связанный вопрос .

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