ЗРЕВРАНК «справедливый» рейтинг в REDIS - PullRequest
0 голосов
/ 22 января 2019

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

Например, когда есть 5 предметов с оценками: 1, 2, 2, 2, 3, я бы хотел, чтобы эти три центральных предмета имели одинаковый ранг (1), в то время как наивысший балл получает ранг 0 (с ZREVRANGE), а самый низкий получает ранг 4.

Я вижу, что можно довольно эффективно запросить количество ключей с одинаковой оценкой O (log (N)), но похоже, что если я хочу получить оценки так, как хочу, я бы использовал Zscan, который является O (N).

Редактировать: добавить полный пример на основе принятого решения

Наш набор данных представляет собой отсортированный набор с оценками. Например: a имеет оценку 1, b, c и d имеют оценку 2, а e имеет оценку 3:

127.0.0.1:6379> zadd aset 1 a
(integer) 1
127.0.0.1:6379> zadd aset 2 b
(integer) 1
127.0.0.1:6379> zadd aset 2 c
(integer) 1
127.0.0.1:6379> zadd aset 2 d
(integer) 1
127.0.0.1:6379> zadd aset 3 e
(integer) 1

ZREVRANK работает для тех предметов с уникальным счетом:

127.0.0.1:6379> zrevrank aset a
(integer) 4
127.0.0.1:6379> zrevrank aset e
(integer) 0

Но это не работает для предметов с одинаковым счетом:

127.0.0.1:6379> zrevrank aset b
(integer) 3
127.0.0.1:6379> zrevrank aset c
(integer) 2
127.0.0.1:6379> zrevrank aset d
(integer) 1

Чтобы решить эту проблему, сначала наберите счет с ZSCORE :

127.0.0.1:6379> zscore aset c
"2"

Другие предметы имеют одинаковое количество очков, конечно:

127.0.0.1:6379> zscore aset b
"2"
127.0.0.1:6379> zscore aset d
"2"

Чтобы получить их звание, просто используйте ZCOUNT со счетом:

127.0.0.1:6379> zcount aset (2 +inf
(integer) 1

Это также работает для тех предметов, которые имеют уникальный счет:

127.0.0.1:6379> zcount aset (1 +inf
(integer) 4
127.0.0.1:6379> zcount aset (3 +inf
(integer) 0

Запись этого текста в виде атомарного сценария lua оставлена ​​читателю в качестве упражнения.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Для данного предмета со счетом x вы можете определить его ранг за время O (log (N)) с помощью ZCOUNT (X +inf.

То, как вы его используете, будет зависеть от деталейвашей реализации.

0 голосов
/ 22 января 2019

ZREVRANGEBYLEX может использоваться в этом случае.Временная сложность в этом случае будет O (log (N) + M), где N - количество элементов в отсортированном наборе, а M - количество возвращаемых элементов.Посмотрите синтаксис ZRANGEBYLEX .

Семейство команд отсортированного набора Lex позволяет задавать лексикографический порядок для ключей с одинаковыми значениями.

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