дизайн базы данных Redis — определение правильного типа данных и создание вторичных индексов

у меня есть следующие данные, которые выглядят так:

{
location: 'zimbabwe',
phone_num: 123-123-1234,
ext: 2222
}

or

{
location: 'puerto rico',
phone_num: 222-222-2222,
ext: 8888
}

Мои конечные пользователи должны иметь возможность запрашивать REST API и отправлять что-то вроде этого:

http://myapp/internalext/123-123-1234

который должен возвращать внутреннее значение расширения 2222.

Но мне также нужно иметь возможность поддерживать такой запрос:

http://myapp/phonenumber/[email protected]

Это должно вернуть мне значение 123-123-1234.

Чтобы иметь возможность поддерживать такие запросы, я хотел бы знать, как лучше всего создавать мои данные в Redis. Мне нужно создать веб-API node-redis.

До сих пор я пытался создавать такие данные:

127.0.0.1:6379> set phone:1
"{\"id\":1, \"locid\":1, \"loc_name\":\"zimbabwe\", \"extension\":\"2222\", \"e164\":\"1231231234\"}"

Затем я создал вторичный индекс, ссылающийся на тот же объект телефона:

127.0.0.1:6379> hset phone:lookup:e164 1231231234 1

Теперь, когда я делаю запрос, мне нужно выполнить два поиска, чтобы найти нужную мне нормативную информацию. Поэтому, если пользователь передает мне полный номер телефона, я должен выполнить следующие запросы:

1. First lookup using the e164 as key:
127.0.0.1:6379> hget phone:lookup:e164 1231231234
"1"

2. now you know that it's the first key in the "phone" set(?? i dunno if this is the terminology)

127.0.0.1:6379> get phone:1
 "{\"id\":1, \"locid\":1, \"loc_name\":\"zimbabwe\", \"extension\":\"2222\", \"e164\":\"1231231234\"}"
127.0.0.1:6379> 

ВОПРОСЫ

Это лучший способ организовать/создать мои данные Redis для этих типов запросов GET? Я просто читаю о хэшах. Но я недостаточно знаком, чтобы знать, как действовать дальше. Кроме того, учитывая приведенные выше данные, как мне запросить просмотр всех номеров телефонов и их данных?


person Happydevdays    schedule 08.09.2016    source источник
comment
Нужно узнать больше о вашем требовании. Всегда ли он получает добавочный номер из номера телефона и наоборот, или вам может потребоваться получить местоположение из добавочного номера или номера телефона?   -  person Karthikeyan Gopall    schedule 09.09.2016
comment
@KarthikeyanGopall основной перевод будет между номером телефона и добавочным номером ... но как только я определил правильную запись, мне может потребоваться вернуть больше, чем одно поле. Но поскольку запись такая маленькая / не слишком много полей, я могу просто вернуть все, если вы не видите каких-то проблем?   -  person Happydevdays    schedule 09.09.2016


Ответы (2)


Я бы использовал HMSET для хранения всей записи, а затем простой ключ/значение для запроса данных. Например:

HMSET 123-123-1234 location "zimbabwe" phone_num "123-123-1234" ext "2222"
HMSET 222-222-2222 location "puerto rico" phone_num "222-222-2222" ext "8888"

SET ext:2222 123-123-1234
SET ext:8888 222-222-2222

Чтобы получить 123-123-1234, вы используете:

GET ext:2222

Учитывая число, чтобы получить ext или location:

HMGET 123-123-1234 ext 
HMGET 123-123-1234 location
person noun    schedule 08.09.2016
comment
как будут выглядеть запросы в этом случае? - person Happydevdays; 09.09.2016
comment
другой вопрос будет в приведенном выше примере, может ли myhash1 быть просто номером телефона? И таким образом я мог бы избавиться от SADD, который вы должны сопоставить phone_num с myhash? - person Happydevdays; 09.09.2016
comment
На ваш второй комментарий ответы да и да. Я обновлю ответ с помощью запросов. - person noun; 09.09.2016

Может быть, в вашем GET http://myapp/phonenumber/[email protected] вы ищете номер PSTN для данного URI (а не просто для данного расширения)?

Если это так (и я только предполагаю здесь, основываясь на вашем ключе с именем «e164»), поиск будет для номера телефона, URI которого равен sip:[email protected], и ожидается, что ваше приложение вернет номер телефона 123-123-1234. Другими словами, что такое DID для компании ABC, чтобы звонок можно было совершить через PSTN, а не через IP...

> get phone:1
"{
  \"id\":1, 
  \"locid\":1, 
  \"loc_name\":\"zimbabwe\",
  \"iso3166\":\"ZW\",
  \"loc_idd\":\"263\",
  \"extension\":\"2222\", 
  \"e164\":\"4.3.2.1.3.2.1.3.2.1.3.6.2.e164.arpa.\",
  \"uri":\"sip:[email protected]\",
  \"pstn\":\"+2631231231234\",
  \"ui_disp_long\":\"+263-123-123-1234\",
  \"ui_disp_short\":\"123-123-1234\"
}"
>

Что касается вашего вопроса REST/redis, я согласен с @noun.

person fooBear    schedule 24.10.2016