структура redis, представление
Я новичок в redis, и у меня есть набор данных из нескольких миллионов идентификаторов членов, электронных писем и имен пользователей, и я думаю о сохранении их, например, в структурах списков. Я думаю list
и sorted set
может быть лучше подходит для моего случая.
прямо сейчас я использую первую букву имени пользователя для индексирования в список и передачи данных в задний список:rpush list:name:a username,member_id
. Однако, поскольку список не отсортирован, получение определенной записи в пределах нескольких миллионов записей будет медленно?
будет ли отсортированный набор (потому что он отсортирован) лучше, чем список в этом случае? Или у вас есть другие рекомендации по повышению производительности?
ключ для доступа к записям должен быть именем пользователя и электронной почтой.
1 ответов
доступ к списку по любому индексу, который не находится рядом с фронтом или концом, будет дорогим, стоимостью 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 "ключевое имя" здесь "пользователь: 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 для.сайт Ио.