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

17

我有一个程序,它会从Redis数据存储中轮询某个键,并在值满足特定条件时执行某些操作。

然而,我认为定期在Redis上轮询效率相当低下,我想知道是否有一种“触发器”机制适用于Redis,当值更改并满足条件时,将调用该触发器。该触发器可能是一个RPC函数、HTTP消息或其他东西,这样我就不需要再轮询了,就像轮询和中断之间的区别。

这种可能吗?

4个回答

18
您可以使用 Redis 的 Pub/Sub 特性。根据您所描述的情况,这正是您需要的东西。
基本上,您可以 SUBSCRIBE 到一个 "channel",然后应用程序的另一部分通过 (PUBLISH) 将要更改的值写入该 channel。您的订阅者(消费者,即想要了解更改的客户端)将几乎实时地收到通知。

1
谢谢你的回答。我已经阅读了Redis的Pub/Sub功能的文档,但仍然不明白如何在值更改时触发。谁将执行“Pub”操作?如果不轮询值,如何触发“Pub”操作? - ciphor
编写值的客户端应该发布值已更改的消息。 - Didier Spezia
如果我理解您的问题正确,那么思路是改变您的应用程序逻辑,因此您不仅可以将值写入“普通”Redis键,还可以将其写入通道,以便立即通知每个订阅者(当然可以只有一个)。@ciphor - Ofer Zelig
好主意,如果Firebase支持像这样的触发器和存储过程将会非常棒。尤其是异步触发器(以在短时间内去重操作)。 - diyism

6
自 Redis 2.8 (发布 2013 年 11 月 22 日) 起,新增了 Keyspace Notifications 功能,使客户端能够订阅特殊的 Pub/Sub 频道以获取 keyspace 事件,你可以将其用作某个键的触发器。
该功能默认处于禁用状态,因为“虽然不是非常明智,但该功能会消耗一些 CPU 资源。” 要启用它,请发送一个 CONFIG SET 命令来 配置 该功能。例如,以下命令将启用 String 命令的 keyspace 事件:
> CONFIG SET notify-keyspace-events K$
OK

接下来,使用常规的pubsub SUBSCRIBE 命令订阅特定命名的频道。例如,要监听DB 0中mykey键的keyspace事件:
> SUBSCRIBE __keyspace@0__:mykey
Reading messages... (press Ctrl-C to quit)

通过从另一个客户端设置键的值来测试该功能:

> SET mykey myvalue
OK

你应该在已订阅的客户端收到一条消息:
1) "message"
2) "__keyspace@0__:mykey"
3) "set"

收到事件后,您可以获取更新后的值并查看其是否符合应用程序代码中的条件。

1

如果您可以使用Pub/Sub,那是最好的。如果由于某种原因无法使用,您也可以使用(性能受影响的)MONITOR命令,该命令将向您发送服务器接收到的每个命令。这可能不是一个好主意。

特别针对列表,您可以使用BLPOP,它将阻塞连接,直到有新项目可从列表中弹出。


0

怎么样加入一个消息框来处理?比如,当两个消息(AND运算)同时满足条件时,就触发另外一个消息,我认为这样做可以起到一定的作用。类似于JBPM,但不需要那么复杂。


也许我们可以在每个消息中添加钩子,在条件可用之前和之后检查另一个消息。 - Kenter Nian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接