Фильтрация по категории для списков лидеров в Redis - PullRequest
0 голосов
/ 05 мая 2020

Я использую Redis и отсортированные наборы для создания таблицы лидеров для игры, и мне удалось заставить работать базовую c версию. Мне интересно, можно ли дополнительно фильтровать по категориям? Например, предположим, что я отслеживаю количество пользователей по всему миру, и у каждого пользователя есть поле страны, в котором указано, откуда они. из конкретной страны (а не из всей базы данных)?

1 Ответ

3 голосов
/ 05 мая 2020

Да, это возможно, но это увеличит сложность как прикладного уровня, так и хранилища данных до sh этого. Поскольку Redis - это хранилище ключей / значений, запросы по нескольким условиям (страна, уровень игры, пол, ежедневные / еженедельные / ежемесячные популярные пользователи) являются признаком того, что вам может потребоваться другое решение этой проблемы. Когда вам нужно запросить несколько полей, вы продолжаете денормализовать свои данные, чтобы удовлетворить требования бизнеса. Redis - не одно из лучших решений для такого рода проблем.

Cassandra (широкое хранилище столбцов, No SQL база данных) или PostgreSQL (RDBM) будут решением, которое следует рассмотреть на этом этапе. . Вы можете продолжать писать / обновлять до Postgres и кэшировать свои результаты в Redis на определенное время.

Если вы хотите реализовать это в Redis; Вам необходимо использовать региональные стандарты как часть ключа.

У вас будет ключ users для глобального отслеживания пользователей, и у вас будут такие ключи, как users:it, users:es et c. чтобы отслеживать их в соответствии с их страной. Всякий раз, когда вы устанавливаете / обновляете пользователя, вам необходимо установить / обновить его в наборе страны пользователя.

127.0.0.1:6379> zadd users 15 a
(integer) 1
127.0.0.1:6379> zadd users:it 15 a
(integer) 1
127.0.0.1:6379> zadd users 23 b 34 c
(integer) 2
127.0.0.1:6379> zadd users:es 23 b 34 c
(integer) 2
127.0.0.1:6379> zrevrange users 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> zrevrange users 0 -1 withscores
1) "c"
2) "34"
3) "b"
4) "23"
5) "a"
6) "15"
127.0.0.1:6379> zrevrange users:it 0 -1 withscores
1) "a"
2) "15"
127.0.0.1:6379> zrevrange users:es 0 -1 withscores
1) "c"
2) "34"
3) "b"
4) "23"
127.0.0.1:6379> zadd users 45 b
(integer) 0
127.0.0.1:6379> zadd users:es 45 b
(integer) 0
127.0.0.1:6379> zrevrange users:es 0 -1 withscores
1) "b"
2) "45"
3) "c"
4) "34"
127.0.0.1:6379> zrevrange users 0 -1 withscores
1) "b"
2) "45"
3) "c"
4) "34"
5) "a"
6) "15"
127.0.0.1:6379>

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

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