СУММА оценок за последние 24 часа в определенном диапазоне в отсортированном наборе (Redis)

Есть ли способ рассчитать СУММУ оценок, сохраненных за 24 часа с учетом производительности сервера Redis? (Примерно 1 миллион новых строк, добавляемых в день)

Какой правильный формат использовать для хранения временных меток и оценок пользователей с использованием отсортированных наборов?

На самом деле я использую эту команду:

ZADD allscores 1570658561 20

Что касается счета, то это фактическое время в секундах... а другое поле - реальный счет.

Но тут есть проблема! Когда другой пользователь получает такой же балл (20), он не добавляется, поскольку уже присутствует. Есть ли решение этой проблемы?

Я думаю использовать скрипт LUA, но есть 2 головные боли:

  • Сценарий LUA будет блокировать работу других команд до тех пор, пока не завершит задание (что не является хорошей практикой для моего случая, поскольку сценарий должен работать 24/24 7/7, в то время как многим пользователям приходится одновременно получать данные из Кэш-сервер Redis, такой как оценки пользователей, информация об истории и т. Д.) - Кроме того, скрипт LUA должен каждый раз иметь дело со многими записями, сохраняемыми каждый день внутри определенного ключа. - Таким образом, пока скрипт Lua работает, пользователи не могут получать данные. .. зная, что сценарий Lua будет работать в цикле все время.

  • Во-вторых, это связано с первой проблемой, которая не позволяет мне сохранять одинаковую оценку, если я использую метку времени в качестве оценки в команде, поэтому я могу вернуть данные за 24 часа.

Если вы в моем случае, как вы с этим справитесь? Спасибо


person Picsou Gamer    schedule 09.10.2019    source источник


Ответы (1)


Учитывая, что данные нужны за последние 24 часа (скользящее окно), а количество возможных строк составляет 1 миллион. Мы не можем использовать структуру данных отсортированного набора для вычисления суммы с высокой производительностью.

Высокопроизводительный дизайн, а также решение проблемы дублирования результатов:

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

Пример входных данных: ввод 1: пользователь 1 хочет добавить время: 11:10:01 оценка: 20 ввод 2: пользователь 2 хочет добавить время: 11:11:02 оценка: 20 ввод 3: пользователь 1 хочет добавить время: 11:17:04 счет: 50

Вы можете иметь точность в 1 минуту, 5 минут или 1 час и выбрать окно на основе этого.


Если вы принимаете приблизительные данные за 1 час, вы можете получить это во время вставки для ввода 1:

INCRBY SCORES_11_час 20

для входа 2:

INCRBY SCORES_11_час 20

для входа 3:

INCRBY SCORES_11_час 20

Чтобы получить данные за последние 24 часа, нужно просуммировать только 24 часовых ключа.

MGET SCORES_previous_day_12_hour SCORES_previous_day_13_hour SCORES_previous_day_14_hour .... SCORES_current_day_10_hour SCORES_current_day_11_hour


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

для входа 1:

INCRBY SCORES_11_час 20

INCRBY SCORES_11_hour_00_minutes 20

для входа 2:

INCRBY SCORES_11_час 20

INCRBY SCORES_11_hour_00_minutes 20

для входа 3:

INCRBY SCORES_11_час 20

INCRBY SCORES_11_hour_05_minutes 20

Чтобы получить данные за последние 24 часа, вам нужно суммировать только 23 часовых ключа (полные данные часов) + 12 пятиминутных оконных ключей.


Если добавленное время основано на текущем времени, вы можете дополнительно оптимизировать его. (Предполагая, что если это 11-й час, а данные за 10-й, 9-й и предыдущие часы вообще не изменятся).

Как вы сказали, это будет 24/7, мы также можем использовать некоторые вычисленные значения из предыдущих итераций.

Скажем, он вычисляется в 11-й час, вы бы получили значения за последние 24 часа. Если он снова вычисляется в 12-й час, вы можете повторно использовать сумму за 22 промежуточных часа, данные которых не изменились, и получить от Redis только отсутствующие 2-часовые данные.

Точно так же дальнейшие оптимизации могут быть применены в зависимости от ваших потребностей.

person vkm    schedule 10.05.2020