Можно ли использовать Redis для поиска по ключевому значению ИЛИ? Мне нужно сохранить главный список адресов электронной почты, назначить UUID каждому адресу, но иметь возможность найти идентификатор или адрес, используя другую часть данных. Я не могу найти окончательное «да» или «нет». Будут оценены любые примеры.Как обратный поиск в Redis?
ответ
Вы хотите создать 2 HashMaps:
- Hashmap от UUID по электронной почте (uuid_to_email)
- Hashmap от электронной почты до UUID (email_to_uuid)
Например:
> hset uuid_to_email 39315120-9581-11e3-9c4e-0002a5d5c51b [email protected]
> hset email_to_uuid [email protected] 39315120-9581-11e3-9c4e-0002a5d5c51b
Затем для получения значения, используйте HashMap, переводящий от значения у вас есть. Если у вас есть UUID, используйте uuid_to_email:
> hget uuid_to_email 39315120-9581-11e3-9c4e-0002a5d5c51b
"[email protected]"
Если у вас есть электронная почта, использовать email_to_uuid:
> hget email_to_uuid [email protected]
"39315120-9581-11e3-9c4e-0002a5d5c51b"
Вы можете хранить как ключ и значение в комбинации обоих
redis 127.0.0.1:6379> SET XXX:[email protected] XXX:[email protected]
OK
redis 127.0.0.1:6379> SET YYY:[email protected] YYY:[email protected]
OK
redis 127.0.0.1:6379> keys YYY:*
1) "YYY:[email protected]"
redis 127.0.0.1:6379> keys *:[email protected]
1) "YYY:[email protected]"
redis 127.0.0.1:6379> keys XXX:*
1) "XXX:[email protected]"
redis 127.0.0.1:6379> keys *:[email protected]
1) "XXX:[email protected]"
Drawback:: Несмотря на то, что это очень быстро, но он будет блокировать сервер для того времени, а также вы должны будете разделить его на приложение.
Лучше подход: -: Store два ключа Таким образом, ваш поиск будет очень быстро O (1), и вы не должны разделить на уровне приложения
redis 127.0.0.1:6379> SET XXX [email protected]
OK
redis 127.0.0.1:6379> SET [email protected] XXX
OK
redis 127.0.0.1:6379> SET YYY [email protected]
OK
redis 127.0.0.1:6379> SET [email protected] YYY
OK
redis 127.0.0.1:6379> GET XXX
"[email protected]"
redis 127.0.0.1:6379> GET [email protected]
"XXX"
redis 127.0.0.1:6379> GET YYY
"[email protected]"
redis 127.0.0.1:6379> GET [email protected]
"YYY"
Drawback: Подробнее Space
Usi ng KEYS не рекомендуется. Второй подход - это способ сделать это. –
Я не согласен, что это лучший подход. Оба этих метода загрязняют ваше пространство имен корневого уровня и не предлагают вам способ получить полный набор адресов электронной почты или набор UUID. – uberdog
Способ сделать это, чтобы использовать силу множества Redis. Поскольку вы хотите сохранить пространство, имеет смысл использовать хеш-ключи в сочетании со своими значениями в виде наборов обратного поиска, содержащих индексы.
В следующем примере я хочу хранить информацию о имени пользователя, его любимых и где они живут. Затем я хочу иметь возможность делать такие поиски, как «Кто живет в Великобритании и любит виски?«:
ключ прирастить: пользователь (целое число) 1
hmset пользователя: 1 имя ллойд любит виски живет ик OK
Садд пользователя: Имя: ллойд 1 (целое число) 1
SADD пользователь: любит: виски 1 (целое число) 1
SADD пользователя: жизнь: Великобритания 1 (I nteger) ключ 1
прирастить: пользователь (целое число) 2
hmset пользователя: 2 имя иван любит виски живет ик OK
Садд пользователя: Имя: иван 2 (целое число) 1
Sadd пользователя: как: виски 2 (целое число) пользователь 1
Садда: любит: виски 2 (целое число) 1
SADD пользователя: жизнь: NYC 2 (целое число) 1
hmset пользователя: 2 имя иван любит виски живет NYC OK Пользователь
hget: 2 Название "иван"
Сунион пользователь : любит: пользователь виски: живет: ик 1) "1" 2) "2" пользователь
агломерата: любит: пользователь виски: жизнь: Великобритания 1) "1"
SDiff пользователь: любит: пользователь виски: жизнь: ик 1) "2" пользователь
сортировать: любит: виски по весовому * GET пользователю: * -> имя 1) "ллойд" 2) "иван"
сортировать пользователь: любит: виски по весовым * GET пользователя: -> имя пользователя GET: -> живет 1) "ллойд" 2) "ик" 3) "иван" 4) "nyc"
- 1. Redis, окончание сеанса и обратный поиск
- 2. Обратный интеллектуальный поиск (обратный i-поиск), как получить предыдущий результат?
- 3. Обратный поиск в строке
- 4. Обратный и обратный поиск RegEx
- 5. Обратный поиск в C++
- 6. Поиск в Redis хэш-ключ
- 7. Поиск нескольких индексов в redis
- 8. Поиск в значениях redis db
- 9. Как выполнить поиск истории обратной команды в redis-cli
- 10. Как сделать нечеткий поиск в Redis
- 11. Node.js + Redis множественный поиск
- 12. Обратный поиск DNS в perl
- 13. Обратный DNS поиск в Python
- 14. MySQL - полнотекстовый поиск - обратный
- 15. Двойной обратный поиск в джанго?
- 16. Обратный поиск в файле ресурсов?
- 17. Джанго обратный поиск в API
- 18. Обратный поиск лучших практик?
- 19. Обратный поиск NuGet
- 20. Обратный поиск на mongodb
- 21. Algolia Обратный поиск
- 22. Xpath обратный поиск
- 23. Обратный поиск строки
- 24. Обратный поиск в Hibernate Search
- 25. Обратный поиск ссылок Spotify
- 26. Обратный поиск списков списков
- 27. Как сделать обратный поиск в сценарии оболочки
- 28. Как сделать обратный полный поиск в MySQL?
- 29. Enum обратный поиск
- 30. Django многоуровневый обратный поиск
Хэши не предназначены для хранения большого количества элементов, поэтому этот подход действителен только в том случае, если прецедент составляет пару сотен адресов. –
@ItamarHaber Это абсолютно неверно. Например, Instagram [хранит сотни миллионов записей в HashMaps] (http://instagram-engineering.tumblr.com/post/12202313862/storing-hundreds-of-millions-of-simple-key-value-pairs). Из этого сообщения в блоге «нам нужно сохранить около 300 миллионов фотографий обратно к идентификатору пользователя, который их создал ...Мы попросили всегда полезного Pieter Noordhuis, одного из разработчиков ядра Redis, для ввода, и он предложил использовать хеши Redis. «Не только это возможно, это самый эффективный способ хранения таких данных. – uberdog
Также, @ItamarHaber , опубликованная временная сложность hset и hget равна O (1), так вы говорите, что это неверно? – uberdog