Я пытаюсь создать списки лидеров в Redis, чтобы получить X
первые результаты и получить ранг пользователя Y
.
Сортированные списки в Redis выглядят легко, за исключением одной проблемы - мне нужно, чтобы оценки были отсортированы не только по фактическому счету, но и по дате (чтобы тот, кто получил такой же результат ранее, был на первом месте). SQL-запрос будет:
select * from scores order by score desc, date asc
Запуск zrevrange
на отсортированном наборе в Redis использует что-то вроде:
select * from scores order by score desc, key desc
Что поместило бы пользователей с лексикографически большими клавишами выше.
Одно из решений, которое я могу придумать, - это произвести некоторые манипуляции с полем оценки внутри отсортированного набора для получения объединенного числа, состоящего из оценки и отметки времени.
Например, для оценки 555
с отметкой времени 111222333
окончательный результат может быть примерно таким, как 555.111222333
, что ставит новые оценки выше старых (не совсем то, что мне нужно, но можно было бы скорректировать дальше).
Это сработает, но только с небольшими числами, поскольку оценка в отсортированном наборе имеет только 16 значащих цифр, поэтому 10 из них будут потрачены на временную метку сразу, оставляя мало места для фактической оценки.
Есть идеи, как заставить отсортированный набор упорядочивать значения в правильном порядке? Я бы действительно хотел, чтобы конечный результат был отсортированным набором (чтобы легко получить рейтинг пользователя), даже если для создания такого набора требуются некоторые временные структуры и сортировки.