2016-08-10 6 views
0

У меня есть SORTED SET user_id: рейтинг для каждого уровня в игре (уровни 2000+). В комплекте 2 000 000 пользователей. мне нужно создать 2 рейтинга - первый - все пользователи топ 100, второй - топ 5 друзей каждый игрокЛучший способ получить рейтинг друзей пользователей с Redis SORTED SET

Первый может быть решена очень легко с ZRANGE

Но есть проблема с второй, потому что в среднем - каждый пользователь имеет 500 друзей

Существует 2 способа:

1) Я могу сделать 500 запросов с ZSCORE \ ZRANK и сортировкой пользователей на по бэкэнду (слишком много запросов, плохая производительность)

2) I может креа te SORTED SET для каждого пользователя и обновить его на фоне каждого обновления каждого пользователя. (больше данных, больше бара, сложнее)

Может быть, есть другие варианты, которые я пропустил?

ответ

3

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

Я бы рекомендовал что-то вроде этого:

пользователей: {ID}: друзья значения, как идентификаторы друзей
пользователей: табло значений как идентификаторы пользователей и оценки как рейтинг каждого

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

Лучшим ответом на вашу проблему было бы, если у вас есть два отсортированных набора, как описано ранее: Получите пересечение между ними, используя команду «zinterstore» и сохраняя результат в отсортированном наборе, созданном исключительно для этой цели. В результате новый сортированный набор будет содержать все идентификаторы друзей пользователя с их оценкой в ​​качестве оценки (нужно быть осторожным здесь, так как вам нужно будет указать счет нового отсортированного набора, это может быть SUM, MIN или MAX баллов). ref: http://redis.io/commands/zinterstore

На этом этапе, используя простой «zrevrangebyscore» и указав ограничение, будет использоваться отсортированный результат, который вы ищете.

 Смежные вопросы

  • Нет связанных вопросов^_^