Рейтинг игроков: реализация с помощью Redis

Дата публикации: 2023-09-24
Просмотры: 640

В процессе разработки игр часто возникает задача построения рейтингов игроков. Но задача построения и отображения рейтинга не такая и простая. Особенно если игроков в игре очень много.
Так как же можно решить эту задачу?

Рейтинг игроков: реализация с помощью 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 могут улучшить взаимодействие с пользователем, демонстрируя рейтинги и предоставляя персонализированный контент.


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

Следующая статья:

Вышла новая версия PHP 8.3
Поделиться статьей:

Комментарии:

Авторизуйтесь, для того, чтобы оставить комментарий. Войти на сайт
Подписка на новости
Узнавайте о новых статьях первыми.
Профиль