【发布时间】:2012-03-17 13:08:18
【问题描述】:
我有一个程序,它会从 redis 数据存储中轮询某个键,并在该值满足某个条件时执行某些操作。
但是,我觉得在redis上定期轮询是相当低效的,我想知道redis是否有“触发”机制,当值发生变化并满足条件时,就会调用触发器。触发器可能是一个 RPC 函数,或者一个 HTTP 消息,或者其他什么,所以我不需要再轮询它,就像轮询和中断之间的区别一样。
这可能吗?
【问题讨论】:
我有一个程序,它会从 redis 数据存储中轮询某个键,并在该值满足某个条件时执行某些操作。
但是,我觉得在redis上定期轮询是相当低效的,我想知道redis是否有“触发”机制,当值发生变化并满足条件时,就会调用触发器。触发器可能是一个 RPC 函数,或者一个 HTTP 消息,或者其他什么,所以我不需要再轮询它,就像轮询和中断之间的区别一样。
这可能吗?
【问题讨论】:
消息框如何处理?比如2条消息(AND操作)可以触发另一条消息,我觉得这可以说明问题?与 JBPM 类似,但并不复杂。
【讨论】:
自 Redis 2.8(released 2013 年 11 月 22 日)以来,现在有一个名为 Keyspace Notifications 的功能,它允许客户端订阅特殊的 Pub/Sub 通道以获取键空间事件,您可以将其用作某个键的触发器。
默认情况下禁用该功能,因为“虽然不是很明智,但该功能会占用一些 CPU 资源。”要启用,请将CONFIG SET 命令发送到configure 该功能。例如,以下命令将为字符串命令启用键空间事件:
> 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"
收到事件后,你可以获取更新后的值,看看它是否满足你应用代码中的条件。
【讨论】:
如果您可以使用 Pub/Sub,那就最好了。如果由于某种原因不起作用,您还可以使用(影响性能的)MONITOR 命令,它将向您发送服务器收到的每个命令。这可能不是一个好主意。
特别是对于列表,您有BLPOP,它将阻止连接,直到有新项目可以从列表中弹出。
【讨论】:
您可以使用 Redis 的Pub/Sub 功能。鉴于您所描述的情况,这正是您所需要的。
本质上,您将SUBSCRIBE 写入“通道”,而应用程序的另一部分写入 (PUBLISH) 正在更改的值到该通道。您的订阅者(消费者,想要了解更改的客户)将收到几乎实时的通知。
【讨论】: