【问题标题】:redis database design - determining the proper data type and creating secondary indexesredis 数据库设计 - 确定正确的数据类型并创建二级索引
【发布时间】:2016-09-08 19:42:14
【问题描述】:

我有如下数据:

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

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

我的最终用户需要能够查询 REST API 并发送如下内容:

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

应该返回一个内部扩展值 2222。

但我还需要能够支持这样的查询:

http://myapp/phonenumber/2222@abc.com

这应该返回给我一个 123-123-1234 的值

为了能够支持这样的查询,我想知道在 redis 中创建数据的最佳方法是什么。我必须创建一个 node-redis web api。

到目前为止,我已经尝试过创建这样的数据:

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

现在,当我查询时,我必须进行两次查找才能找到我想要的 ifnormation。因此,如果用户将完整的电话号码传递给我,我必须进行以下查询:

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> 

问题

这是为这些类型的 GET 请求组织/创建我的 redis 数据的最佳方式吗? 我只是在阅读有关哈希的信息。但我还不够熟悉,不知道该走哪条路。 另外,鉴于上述数据,我将如何要求查看所有电话号码及其数据?

【问题讨论】:

  • 需要更多地了解您的要求。是否总是从电话号码获取分机,反之亦然,或者您可能需要从分机或电话号码获取位置?
  • @KarthikeyanGopall 主要翻译将在电话号码和分机之间......但是一旦我确定了正确的“记录”,我可能需要返回的不仅仅是一个字段。但是因为记录太小/没有太多字段,我可能会返回所有内容,除非您发现一些问题?

标签: rest redis node-redis


【解决方案1】:

难道是在您的 GET http://myapp/phonenumber/2222@abc.com 中,您正在寻找给定 URI 的 PSTN 号码(而不仅仅是给定扩展名)?

如果是这种情况(我只是根据您名为“e164”的键来猜测),则查找 URI 为 sip:2222@abc.com 的电话号码,并且您的应用程序应返回电话号码 @987654323 @。换句话说,ABC 公司的 DID 是什么,所以呼叫可以通过 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:2222@abc.zw\",
  \"pstn\":\"+2631231231234\",
  \"ui_disp_long\":\"+263-123-123-1234\",
  \"ui_disp_short\":\"123-123-1234\"
}"
>

就您的 REST/redis 问题而言,我同意 @noun。

【讨论】:

    【解决方案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
    

    给定号码获取extlocation

    HMGET 123-123-1234 ext 
    HMGET 123-123-1234 location
    

    【讨论】:

    • 在这种情况下查询会是什么样子?
    • 另一个问题是在上面的例子中,“myhash1”可能只是电话号码吗?这样,我可以摆脱你必须将 phone_num 映射到 myhash 的 SADD?
    • 对于您的第二条评论,答案是肯定的。我会用查询更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2019-06-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多