Веб-таблица лидеров - PullRequest
       7

Веб-таблица лидеров

3 голосов
/ 28 января 2012

Я внедряю Leaderboard в свое веб-приложение django и не знаю, как это сделать.В настоящее время я просто использую SQL, чтобы упорядочить своих пользователей и, из этого, создать таблицу лидеров, однако это создает две основные проблемы:

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

  2. Почти невозможно сказать пользователю, на какой позиции он находится, не выполнив весь расчет таблицы лидеров снова.

Я не развернул, но я оцениваю около 5% обновлений таблицы лидеров по сравнению с95% читают (возможно, даже больше) таблицы лидеров.Поэтому моя последняя идея - снова вычислять таблицу лидеров каждый раз, когда добавляется пользователь, с полем позиции, которое я могу легко отсортировать, и не нужно пересчитывать, чтобы отобразить рейтинг пользователя.

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

Есть ли лучшие способы решить эту проблему?(кто-нибудь знает, как ТАК делает свои списки лидеров?)

Ответы [ 3 ]

2 голосов
/ 28 апреля 2012

Я написал несколько библиотек лидеров, которые могли бы вам помочь.Тот, который будет незамедлительно использоваться, это python-leaderboard , основанный на эталонной реализации leaderboard ruby ​​gem .Используя отсортированные наборы Redis, ваша таблица лидеров будет ранжироваться в режиме реального времени, и на странице таблицы лидеров есть специальный раздел с метриками производительности для вставки большого количества участников в таблицу лидеров одновременно.Вы можете рассчитывать на 1 миллион участников примерно за 30 секунд, если вы конвейеризуете записи.

Если вас беспокоит слишком частое изменение данных в режиме реального времени, вы можете использовать Redis в конфигурации «ведущий-ведомый», и таблицы лидеров будут извлекать данные из ведомого устройства, которое будет периодически запрашивать только у главного.

Надеюсь, это поможет!

1 голос
/ 29 января 2012

Вам понравится концепция отсортированных наборов в Redis.

Не пропустите абзац, описывающий вашу проблему: D

1 голос
/ 28 января 2012

Составьте таблицу, в которой хранятся идентификатор пользователя и оценка пользователя. Просто потяните таблицу лидеров, используя

ORDER BY user_score DESC 

и присоединитесь к Главной таблице для имени пользователя или чего-либо еще, что вам нужно.

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

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