Redis: исключение значений из отсортированного набора на основе значения хеш-поля

Мне было интересно, может ли кто-нибудь дать несколько предложений о том, как сделать генерацию отсортированного набора более эффективной?

Я работаю над проектом, в котором данные рейтинга рассчитываются ежечасно и хранятся в базе данных. Данные можно фильтровать по полу участника, стране и т. д. Необходимо обработать около 2 миллионов строк, и это занимает много времени.

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

В моем прототипе я создаю отсортированный набор для каждой возможной комбинации фильтров, например: Leaderboard.au.male, Leaderboard.au.female и т. д. Я записал этот процесс, но как только вы обработаете каждый случай, это означает, что есть 118 отсортированных наборы созданы.

В идеале я хотел бы иметь единый отсортированный набор ранжирования и наборы хэшей для каждого члена, содержащие их имя, пол и страну. Затем с помощью Redis возвращаются только отсортированные значения набора на основе определенных пользователем фильтров. (например, получить рейтинг только для мужчин из Австралии).

Возможно ли это сделать изначально в Redis?


person Bobby Sciacchitano    schedule 28.03.2012    source источник


Ответы (1)


Я предлагаю вам сохранить набор с рейтингами для всех участников:

leaderboard = { id1: score1, id2: score2, ... }

И набор для каждого типа (пол, страна и т.д.):

members.male = { id1, id2, ... }
members.au = { id2, id3, ... }

Затем вы выполняете ZINTERSTORE:

zinterstore leaderboard.male 2 leaderboard members.male

Или, чтобы получить список лидеров мужчин-членов AU:

zinterstore leaderboard.au.male 3 leaderboard members.male members.au

Вы можете управлять тем, как должна рассчитываться оценка результирующего отсортированного набора, используя WEIGHTS и AGGREGATE.

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

person Linus Thiel    schedule 28.03.2012
comment
Спасибо, это кажется наиболее гибким решением. - person Bobby Sciacchitano; 29.03.2012