Когда у меня есть отсортированный набор с оценками, я бы хотел иметь правильный ранг, даже если несколько предметов имеют одинаковые оценки.
Например, когда есть 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 оставлена читателю в качестве упражнения.