структура Redis, производительность - PullRequest
7 голосов
/ 14 апреля 2011

Я новичок в Redis, и у меня есть набор данных из нескольких миллионов идентификаторов участников, электронных писем и имен пользователей, и я думаю о сохранении их, например, в структурах списков.Я думаю, list и sorted set могут лучше всего подойти для моего случая.

Сейчас я использую первую букву имени пользователя для индексации в списке и передачи данных в черный список: rpush list:name:a username,member_id.Однако, поскольку список не отсортирован, будет ли поиск определенной записи из нескольких миллионов записей медленным?

Будет ли отсортированный набор (потому что он отсортирован) лучше, чем список в этом случае?Или у вас есть другие рекомендации по повышению производительности?

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

1 Ответ

14 голосов
/ 17 апреля 2011

Доступ к списку по любому индексу, который не находится рядом с фронтом или концом, будет дорогостоящим, стоив O (N).Для больших списков это не очень эффективно.

Использование хэшей может лучше всего соответствовать вашим потребностям.Это будет использовать больше памяти, чем список, но обеспечит почти O (1) доступ.

Хэш в redis - это именованный ключ, который может содержать произвольные поля и значения.

Вы можете сохранитьвся запись пользователя в одном хэше redis, названная с использованием member_id (надеюсь, это короткое значение).Если member_id гарантированно будет уникальным для каждого пользователя, вот как заполнить хеш для пользователя member_id 42.

hset user:42 email foo@example.com
hset user:42 username foobar
hset user:42 logincount 0

Redis «имя ключа» здесь - это «user: 42».Каждый пользователь получит один ключ, похожий на одну строку в базе данных SQL, но более гибкий.Затем вы можете обновить два вспомогательных хэша: один для сопоставления имен пользователей с member_id, а другой для сопоставления адресов электронной почты с member_id.Это предполагает, что у вас есть отношение 1: 1 между member_id, именем пользователя и адресом электронной почты.

hset username_to_id foobar 42
hset email_to_id foo@example.com 42

Когда вам нужно найти адрес электронной почты для определенного пользователя, вы сначала ищите member_id из email_to_id хэш, а затем получить поле email из хэша у ключевого пользователя: member_id Аналогично, вы можете начать с имени пользователя, найти member_id в хэше username_to_id, а затем перейти к пользователюзапись хранится у пользователя: member_id хэш.

Вот пример поиска имени пользователя по адресу электронной почты:

redis> hget email_to_id foo@example.com
"42"
redis> hget user:42 username
"foobar"
redis> 

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

redis> hincrby user:42 login_count 1
(integer) 1
redis> hgetall user:42
1. "email"
2. "foo@example.com"
3. "username"
4. "foobar"
5. "login_count"
6. "1"
redis> 

Вы можете найти больше информации о хэшах на сайте redis.io.

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