在Redis/NoSQL中需要帮助概念化

cod*_*ero 7 nosql redis data-structures

我想我已经很好地掌握了使用Redis的所有命令,但是我很难搞清楚使用它的最佳方法.我正在设计一个客户通知系统,当他们的任何电路发出警报时,它会通过他们的首选方法(电子邮件,SNMP,Syslog)通知他们.

所以,我得到一个设备名称和一个端口.我需要将其与单个客户相关联,然后将该客户与交付方法相关联.使用关系数据库,看起来可能看起来像这样:

Device name: Los_Angeles
Port: 11

SELECT Customer_ID, Customer_name from device_info where device_port = 'Los_Angeles:11'
SELECT Customer_protocol, SNMP_destination, Syslog_destination from CUSTOMER 
    where Customer_ID = <customer_id from above>
Run Code Online (Sandbox Code Playgroud)

(非常简化的例子).

我可以看到如何使用列表哈希或散列哈希以编程方式执行此操作.但我想我在Redis遇到的问题是我无法获得那些更复杂的数据结构(据我所知).那么,如何将多条信息与一个密钥相关联?我可以想到一些我可以做到的方法,但它们似乎都涉及多个步骤,我想从当前的Redis程序员那里得到一些关于"最佳"方法的信息.

Did*_*zia 12

你是正确的,Redis只提供简单的数据结构,并且它们不能按值组合(就像你可以用面向文档的数据库,如CouchDB或MongoDB).但是,可以通过引用组合数据结构,这是一种非常常见的模式.

例如,集合中包含的项可以是其他对象(列表,哈希表,其他集等)的键.让我们尝试将此应用于您的示例.

要建模客户与设备+端口之间的关系,您可以使用包含客户ID的集合.要存储有关客户的信息,每个客户一个哈希表就可以了.

以下是客户:

hmset c:1 name Smith protocol tcp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:2 name Jackson protocol udp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:3 name Davis protocol tcp snmp_dest 127.0.0.3 syslog_dest 127.0.0.4
Run Code Online (Sandbox Code Playgroud)

这些记录的键是c:ID

让我们将其中两个与设备和端口相关联:

sadd d:Los_Angeles:11 2 3
Run Code Online (Sandbox Code Playgroud)

这个集合的关键是d:device:port.c:和d:前缀只是一个约定.应创建每个设备/端口一组.给定客户可以属于多个集合(因此与多个设备/端口相关联).

现在要找到附加到此设备/端口的交付方法的客户,我们只需要检索该集的内容.

smembers d:Los_Angeles:11
1) "2"
2) "3"
Run Code Online (Sandbox Code Playgroud)

然后通过管道化一些hgetall命令来检索相应的客户信息:

hgetall c:2
hgetall c:3
1) "name"
2) "Jackson"
3) "protocol"
4) "udp"
5) "snmp_dest"
6) "127.0.0.1"
7) "syslog_dest"
8) "127.0.0.2"
1) "name"
2) "Davis"
3) "protocol"
4) "tcp"
5) "snmp_dest"
6) "127.0.0.3"
7) "syslog_dest"
8) "127.0.0.4"
Run Code Online (Sandbox Code Playgroud)

不要害怕命令的数量.它们非常快,大多数Redis客户端都能够管理查询,因此只需要最少的往返次数.通过使用一个微调和几个hgetall,只需两次往返即可解决问题.

现在,由于无处不在的SORT命令,可以进一步优化.这可能是Redis中最复杂的命令,它可以用来保存往返.

sort d:Los_Angeles:11 by nosort get c:*->name get c:*->protocol get c:*->snmp_dest get c:*->syslog_dest
1) "Jackson"
2) "udp"
3) "127.0.0.1"
4) "127.0.0.2"
5) "Davis"
6) "tcp"
7) "127.0.0.3"
8) "127.0.0.4"
Run Code Online (Sandbox Code Playgroud)

在一个命令中,它检索设备/端口集的内容并获取相应的客户信息.

这个例子很简单,但更一般地说,虽然你可以用Redis表示复杂的数据结构,但它不是直接的.您需要在结构和数据访问方面仔细考虑模型(即在设计时,坚持您的数据您的用例).