Redis: исключая значения из отсортированного набора на основе значения хеш-поля - PullRequest
6 голосов
/ 28 марта 2012

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

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

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

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

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

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

1 Ответ

4 голосов
/ 28 марта 2012

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

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

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

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

Затем высделать ZINTERSTORE:

zinterstore leaderboard.male 2 leaderboard members.male

Или, чтобы получить таблицу лидеров из членов АС:отсортированный набор должен быть рассчитан с использованием WEIGHTS и AGGREGATE.

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

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