我想我对使用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>
(大大简化了示例)。
我可以看到如何使用列表哈希或哈希哈希以编程方式执行此操作。但是我想我在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客户端都具有对查询进行管线化的功能,因此仅需要最少的往返次数。通过仅使用一个成员和几个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表示复杂的数据结构,但这并不是立即的。您需要在结构和数据访问方面仔细考虑模型(例如,在设计时,坚持使用数据
和 用例)。
我正在实验室工作,这是一个连接四的游戏。我在基本概念方面遇到了麻烦,例如类如何相互通信,如何使用私有实例变量,如何使用ArrayList,如何比较JLabels或将它们设置为可比较的东西...... 为了给出一个简单的分类,我有四个类:GUI、游戏、玩家、名称 我可以通过使用两个四循环来创建GUI,游戏是一个7列6块的网格。这些作品是图像, 例如,表示空白点。 图形用户界面是基于一个JFrame,
我已经从Godaddy购买了SSL,我的网站托管在AWS中。我想在AWS上设置SSL。我绑定使用证书管理器导入证书。它问了我三件事: 证书体*--在这里,我从Godaddy获得了。crt文件内容 证书私钥*--这里我仍然困惑需要输入什么。请帮我做这个 证书链--在这里我输入了sf_bundle-g2-g1.crt代码。 请帮助我启用AWS中的SSL。提前致谢
首先,我是C、C++、C#、Android和Swift的开发人员,但我绝对没有JavaScript、PHP或Web开发经验。 即只接受整数值的输入。 这是刀片代码:
问题内容: 怀疑在VBA ADO和Sql查询中… 我有2张纸,即adodc1,adodc2(在一本工作簿中) 在adodc1中具有“名称”,“部门”列,有时其具有“ Sect”列 在adodc2中具有“名称”,“部门”,“宗派”列 我想要的是当我运行Query..Vba时需要检查adodc1是否具有Sect列。 要返回为空值.. 下面的代码取自“”,根据我的需要进行了更改 它将执行的工作是来自两张
我再次下载了java sdk(如这里所示:http://www.oracle.com/technetwork/java/JavaFX/downloads/index.html),但是当我右键单击一个项目时,JavaFX并没有显示出来。(如果有关系的话,我使用的是eclipse上的scala插件) 我去了这里:http://www.eclipse.org/efxclipse/install.html
然后,这需要转到数据库,该数据库向工作人员发送返回消息,告诉他们该成员已被添加。 只有工作人员在和系统通话,没有人。