Рейтинг игроков: реализация с помощью Redis
В процессе разработки игр часто возникает задача построения рейтингов игроков. Но задача построения и отображения рейтинга не такая и простая. Особенно если игроков в игре очень много.
Так как же можно решить эту задачу?
Рейтинг игроков — это сводная таблица лидеров или рейтинговый список, отсортированная по каком то одному параметру (оценке), связанным с участником.
При рзработки системы рейтингов на первую очередь встают следующие вопросы:
- где хранить рейтинги
- как обновлять значения игроков
- как делать выбоорку
- как определять место игрока
1. Хранение данных
1.1 База данных
Первое что приходит в голову, это сделать обычную таблицу в какой то БД (например MySQL) и там как вариант хранить записи вида (player_id, value).
Чтобы делать быстрые выборки из такой таблицы, на нее придется повесить 2 отдельных индекса для следующих операций:
- выборка отсортированного списка по значению
- выборка значения конкретного игрока
- обновление значения конкретного игрока
Но при таком подходе остается проблема с вычислением мест игроков в рейтинге. Для этого придется каждый раз делать выборку всей таблицы.
Как альтернатива, можно места игроков хранить так же в таблице. Но тогда эти места надо постоянно пересчитывать, что очень затратно.
Какие же есть альтернативы?
1.1 Redis
Redis — это популярное хранилище структур данных в памяти с открытым исходным кодом, которое широко используется для кэширования, анализа в реальном времени и высокопроизводительных сценариев.
Одной из мощных функций Redis является его способность обрабатывать отсортированные наборы (Sorting Sets) — структуру данных, которая сочетает в себе быструю вставку, извлечение и ранжирование элементов.
Рейтинговый список - это список где каждому элементу в списке присвоена оценка, и Redis поддерживает этот список в отсортированном порядке на основе этих оценок. Рейтинговый список можно использовать в различных сценариях, таких как сортировка лучших результатов в игре, отслеживание рейтингов популярности или ранжирование активности пользователей.
2. Создание и обновление данных
Чтобы создать рейтинговый список Redis, мы можем использовать структуру данных Sorted Set, предоставляемую Redis. Давайте посмотрим, как мы можем добавлять и обновлять элементы в рейтинговом списке:
2.1 Добавьте или обновите участника, указав его оценку:
ZADD rating_list 100 "Player1"
ZADD rating_list 200 "Player2"
ZADD rating_list 150 "Player3"
В приведенном выше примере мы добавляем игроков в набор «rating_list» с их соответствующими баллами. Redis заботится о поддержании порядка элементов на основе их оценок.
2.2 Увеличить оценку участника:
ZINCRBY rating_list 50 "Player1"
Эта команда увеличивает оценку «Player1» в рейтинговом списке на 50. Redis соответствующим образом обновляет порядок элементов.
3. Выборка данных
После заполнения рейтингового списка мы можем получить рейтинги на основе оценок:
3.1 Получите рейтинг участников в порядке возрастания:
ZRANGE rating_list 0 -1
Эта команда извлекает всех участников рейтингового списка в порядке возрастания их баллов. Результат дает нам ранжированный список участников.
3.2 Получите участников в определенном диапазоне рангов:
ZRANK rating_list "Player3"
Эта команда получает рейтинг «Player3» в рейтинговом списке. Redis возвращает индекс, начинающийся с нуля, поэтому ранг (место) «Player3» в этом случае будет равен 2.
3.3 Получите участников с баллами в определенном диапазоне:
ZRANGEBYSCORE rating_list 100 200
Эта команда извлекает участников из рейтингового списка с баллами от 100 до 200. Мы можем указать дополнительные параметры, чтобы ограничить набор результатов.
4. Обновление и управление рейтинговым списком Redis
Redis предоставляет различные команды для обновления и управления рейтинговым списком:
4.1 Удалить участника из рейтинг-листа:
ZREM rating_list "Player2"
Эта команда удаляет «Player2» из рейтингового списка.
4.2 Получите общее количество участников в рейтинг-листе:
ZCARD rating_list
Эта команда возвращает общее количество участников в рейтинговом списке.
5. Применение рейтинговых списков Redis
Рейтинговые списки Redis имеют различные практические применения:
- Таблицы лидеров. Игровые платформы могут использовать списки рейтингов Redis для отслеживания и отображения рейтингов в таблице лидеров на основе очков или достижений игроков.
- Рейтинги популярности. Веб-сайты или платформы социальных сетей могут использовать рейтинговые списки для ранжирования и отображения популярных сообщений, статей или пользователей на основе показателей вовлеченности.
- Аналитика в реальном времени. Списки рейтингов можно использовать для отслеживания и отображения аналитики в реальном времени, например, актуальных тем, наиболее просматриваемого контента или активных пользователей.
- Рекомендации. В системах рекомендаций рейтинговые списки Redis могут помочь идентифицировать популярные элементы или пользователей для создания персонализированных рекомендаций.
Списки рейтингов Redis предоставляют простой и эффективный способ ранжирования на основе оценок. Благодаря высокой производительности Redis и отсортированной структуре данных он становится идеальным выбором для обработки сценариев таблицы лидеров и анализа в реальном времени. Независимо от того, создаете ли вы игру, социальную платформу или аналитическую панель, списки рейтингов Redis могут улучшить взаимодействие с пользователем, демонстрируя рейтинги и предоставляя персонализированный контент.
Если у вас остались вопросы, то пишите комментарии и мы все обсудим.
Если будет необходимость в примере реализации системы рейтинга на ЯП, то пишите и все будет.