2014-02-13 2 views
3

Можно ли использовать Redis для поиска по ключевому значению ИЛИ? Мне нужно сохранить главный список адресов электронной почты, назначить UUID каждому адресу, но иметь возможность найти идентификатор или адрес, используя другую часть данных. Я не могу найти окончательное «да» или «нет». Будут оценены любые примеры.Как обратный поиск в Redis?

ответ

2

Вы хотите создать 2 HashMaps:

  1. Hashmap от UUID по электронной почте (uuid_to_email)
  2. 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" 
+1

Хэши не предназначены для хранения большого количества элементов, поэтому этот подход действителен только в том случае, если прецедент составляет пару сотен адресов. –

+1

@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

+0

Также, @ItamarHaber , опубликованная временная сложность hset и hget равна O (1), так вы говорите, что это неверно? – uberdog

2

Вы можете хранить как ключ и значение в комбинации обоих

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

+3

Usi ng KEYS не рекомендуется. Второй подход - это способ сделать это. –

+0

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

0

Способ сделать это, чтобы использовать силу множества 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"

Смежные вопросы