Data structures 需要帮助在Redis/NoSQL中进行概念化吗

Data structures 需要帮助在Redis/NoSQL中进行概念化吗,data-structures,nosql,redis,Data Structures,Nosql,Redis,我想我已经很好地掌握了使用Redis的所有命令,但是我很难找到使用它的最佳方法。我正在设计一个客户通知系统,当他们的任何电路出现警报时,该系统将通过他们首选的方法(电子邮件、SNMP、系统日志)通知他们 所以,我得到了一个设备名和一个端口。我需要将其与单个客户关联,然后将该客户与交付方法关联。对于关系数据库,它可能看起来像这样: Device name: Los_Angeles Port: 11 SELECT Customer_ID, Customer_name from device_inf

我想我已经很好地掌握了使用Redis的所有命令,但是我很难找到使用它的最佳方法。我正在设计一个客户通知系统,当他们的任何电路出现警报时,该系统将通过他们首选的方法(电子邮件、SNMP、系统日志)通知他们

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

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>
设备名称:洛杉矶
港口:11
从设备信息中选择客户ID、客户名称,其中设备端口='Los\u Angeles:11'
从Customer中选择Customer_协议、SNMP_目的地、Syslog_目的地
其中Customer_ID=
(大大简化了示例)


我可以看到如何以编程方式使用列表哈希或哈希哈希来实现这一点。但我想我在Redis中遇到的问题是,那些更复杂的数据结构对我来说是不可用的(据我所知)。那么,如何将多条信息与一个键相关联?我可以想出几种方法,但它们似乎都涉及多个步骤,我想从当前的Redis程序员那里得到一些关于“最佳”方法的信息。

您是对的,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
这些记录的键是c:ID

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

sadd d:Los_Angeles:11 2 3
这个集合的键是d:device:port。c:和d:前缀只是一种约定。 应为每个设备/端口创建一个集合。给定的客户可能属于多个集合(因此与多个设备/端口关联)

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

smembers d:Los_Angeles:11
1) "2"
2) "3"
然后,可以通过管道传输多个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"
不要害怕命令的数量。它们非常快,而且大多数Redis客户端都能够管道化查询,因此只需要最少的往返次数。只需使用一个SMember和几个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"
在一个命令中,它检索设备/端口集的内容并获取相应的客户信息


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

你看过Redis散列吗?例如,hmset/hmget可以让你关联一个键和多个可以代表你身份的“字段”。《Redis》一书有一些很好的例子。我实际上没有看到hmset/hmget。它一定是在我学习完教程后新添加的。我将使用它。谢谢!这是exa这正是我要找的。