我有一个程序,它将从redis数据存储区中查询某个键,并在值满足某个条件时执行某些操作。
但是,我认为定期轮询redis是非常低效的,我想知道redis是否有“触发”机制,当值改变并满足条件时,将调用触发器。触发器可能是一个RPC函数,或一个HTTP消息,或其他东西,所以我不需要再对它进行轮询,就像轮询和中断之间的区别一样。
这可能吗?
答案 0 :(得分:14)
您可以使用Redis的Pub/Sub功能。正如您所描述的那样,这正是您所需要的。
基本上,您SUBSCRIBE
到“频道”,而您的应用程序的另一部分会将(PUBLISH
)值更改为该频道。您的订户(消费者,想要了解更改的客户)将得到几乎实时的通知。
答案 1 :(得分:0)
如果你可以使用Pub / Sub,那是最好的。如果由于某些原因不起作用,您还可以使用(性能影响)MONITOR
命令,该命令将向您发送服务器接收的每个命令。这可能不是一个好主意。
特别是对于列表,您有BLPOP
,这将阻止连接,直到有新项目可供从列表中弹出。
答案 2 :(得分:0)
自Redis 2.8(released,2013年11月22日)以来,现在有一个名为Keyspace Notifications的功能,该功能使客户端可以为键空间事件订阅特殊的发布/订阅通道,您可以将其用作触发某个键。
默认情况下,此功能为禁用状态,因为“虽然不太明智,但该功能会使用一些CPU电源”。要启用该功能,请向CONFIG SET
功能发送configure命令。例如,以下命令将为String命令启用键空间事件:
> CONFIG SET notify-keyspace-events K$
OK
接下来,使用常规的pubsub SUBSCRIBE
命令来订阅特殊命名的频道。例如,要监听DB 0中mykey
键上的键空间事件:
> SUBSCRIBE __keyspace@0__:mykey
Reading messages... (press Ctrl-C to quit)
通过设置其他客户端的密钥值来测试该功能:
> SET mykey myvalue
OK
您应该在订阅的客户端中收到一条消息:
1) "message"
2) "__keyspace@0__:mykey"
3) "set"
收到事件后,您可以获取更新的值,并查看其是否满足您的应用程序代码中的条件。
答案 3 :(得分:0)
如何处理一个消息框?例如,2条消息(AND操作)可能触发另一条消息,我认为这可以说明问题吗?类似于JBPM,但并不复杂。