如何为redis数据存储区实现“触发器”?

时间:2012-02-28 02:27:04

标签: triggers nosql redis

我有一个程序,它将从redis数据存储区中查询某个键,并在值满足某个条件时执行某些操作。

但是,我认为定期轮询redis是非常低效的,我想知道redis是否有“触发”机制,当值改变并满足条件时,将调用触发器。触发器可能是一个RPC函数,或一个HTTP消息,或其他东西,所以我不需要再对它进行轮询,就像轮询和中断之间的区别一样。

这可能吗?

4 个答案:

答案 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,但并不复杂。