Загвоздка в том, как вы определяете «последний час». Гораздо проще сделать это с «часами», а не с «последними 60 минутами». Я объясню, как сделать часы, учитывая их простоту.
Вы можете использовать HINCRBY с отрицательными числами. Итак, если я вас правильно понял, у вас должна быть возможность иметь один хеш для каждого часа с истечением срока действия для автоматического удаления старых часов.
Когда пользователь закончил свою игру, вы делаете:
Идентификатор пользователя HINCR "таблица лидеров: номер часа"
Это даст вам очки, полученные или потерянные за этот час. Теперь, например, чтобы получить 10 лучших, вам нужно пройти маршрут HGETALL, чтобы вернуть все обратно и выполнить сортировку на стороне клиента.
Чтобы использовать аспект кэширования, вы можете затем сохранить полученные значения пользователей/точек «top X» в ключе (например, сохранить его как JSON), срок действия которого истекает каждые N минут. При этом процесс, отображающий рейтинг, будет извлекать этот ключ и отображать его, если он найден, в противном случае генерировать/сохранять/отображать результат. В качестве альтернативы или в дополнение к вышеперечисленному у вас может быть запланированное задание, которое вычисляет и сохраняет результаты для отображения каждую минуту.
Поскольку пользователи могут (хотя и редко) иметь одинаковое изменение чистых баллов, я бы не стал использовать отсортированный набор, в котором общее количество баллов является результатом.
Чтобы сделать это с скользящим окном, вы могли бы сделать что-то вроде поминутного хэша, как указано выше, вместо почасового (возможно, таблица лидеров: число минут), а на стороне расчета выяснить, на каком минутном номере вы находитесь прямо сейчас. и выполните HGETALL для предыдущих 60-минутных хэшей в конвейере. Конечно, установите для поминутных хэшей срок действия после 60, чтобы уменьшить использование.
Делая это таким образом, вы вычисляете ключи, а не запрашиваете их.
Я подозреваю, что вы также могли бы выполнить итоговый аспект с помощью Lua-скрипта, но по мере роста вашей клиентской части и увеличения числа обращений к ней будет более горизонтально масштабируемым выполнение этих вычислений на клиенте.
person
The Real Bill
schedule
29.01.2015