我有一个程序,它将轮询redis数据存储中的某个键,并在值满足某个条件时执行某些操作。不过,我觉得在redis上周期性的轮询效率比较低,我想知道redis是否有一个“trigger”机制,当值发生变化并且满足条件时,就会调用trigger。触发器可能是一个rpc函数,或者一个httpmsg,或者其他什么,这样我就不需要再轮询它了,就像轮询和中断之间的区别一样。这可能吗?
bbmckpt71#
自从redis 2.8(2013年11月22日发布)以来,现在有一个称为keyspace notifications的功能,它允许客户端为keyspace事件订阅特殊的pub/sub通道,您可以将其用作某个密钥的触发器。默认情况下,该功能被禁用,因为“虽然不太合理,但该功能使用了一些cpu电源。” CONFIG SET 命令来配置功能。例如,以下命令将为字符串命令启用键空间事件:
CONFIG SET
> CONFIG SET notify-keyspace-events K$ OK
接下来,使用常规pubsub SUBSCRIBE 命令订阅特别命名的频道。例如,在 mykey 输入数据库0:
SUBSCRIBE
mykey
> SUBSCRIBE __keyspace@0__:mykey Reading messages... (press Ctrl-C to quit)
通过从另一个客户端设置键的值来测试功能:
> SET mykey myvalue OK
您应该在订阅的客户端中收到一条消息:
1) "message" 2) "__keyspace@0__:mykey" 3) "set"
接收到事件后,可以获取更新后的值,并查看它是否满足应用程序代码中的条件。
x33g5p2x2#
您可以使用redis的pub/sub特性。这正是你所描述的情况下所需要的。基本上,你 SUBSCRIBE 应用程序的另一部分写入( PUBLISH )正在更改为该通道的值。您的订户(消费者,希望了解更改的客户)将得到几乎实时的通知。
PUBLISH
xytpbqjk3#
如何处理一个消息框?例如,2个消息(和操作)可以触发另一个消息,我认为这可以说明一些问题?像jbpm,但并不复杂。
xeufq47z4#
如果你能使用pub/sub,那是最好的。如果由于某种原因无法工作,您还可以使用(性能影响) MONITOR 命令,它将向您发送服务器接收到的所有命令。那可能不是个好主意。特别是对于列表,你有 BLPOP ,这将阻止连接,直到可以从列表中弹出新项目。
MONITOR
BLPOP
4条答案
按热度按时间bbmckpt71#
自从redis 2.8(2013年11月22日发布)以来,现在有一个称为keyspace notifications的功能,它允许客户端为keyspace事件订阅特殊的pub/sub通道,您可以将其用作某个密钥的触发器。
默认情况下,该功能被禁用,因为“虽然不太合理,但该功能使用了一些cpu电源。”
CONFIG SET
命令来配置功能。例如,以下命令将为字符串命令启用键空间事件:接下来,使用常规pubsub
SUBSCRIBE
命令订阅特别命名的频道。例如,在mykey
输入数据库0:通过从另一个客户端设置键的值来测试功能:
您应该在订阅的客户端中收到一条消息:
接收到事件后,可以获取更新后的值,并查看它是否满足应用程序代码中的条件。
x33g5p2x2#
您可以使用redis的pub/sub特性。这正是你所描述的情况下所需要的。
基本上,你
SUBSCRIBE
应用程序的另一部分写入(PUBLISH
)正在更改为该通道的值。您的订户(消费者,希望了解更改的客户)将得到几乎实时的通知。xytpbqjk3#
如何处理一个消息框?例如,2个消息(和操作)可以触发另一个消息,我认为这可以说明一些问题?像jbpm,但并不复杂。
xeufq47z4#
如果你能使用pub/sub,那是最好的。如果由于某种原因无法工作,您还可以使用(性能影响)
MONITOR
命令,它将向您发送服务器接收到的所有命令。那可能不是个好主意。特别是对于列表,你有
BLPOP
,这将阻止连接,直到可以从列表中弹出新项目。