【问题标题】:How to implement "trigger" for redis datastore?如何为 redis 数据存储实现“触发器”?
【发布时间】:2012-03-17 13:08:18
【问题描述】:

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

但是,我觉得在redis上定期轮询是相当低效的,我想知道redis是否有“触发”机制,当值发生变化并满足条件时,就会调用触发器。触发器可能是一个 RPC 函数,或者一个 HTTP 消息,或者其他什么,所以我不需要再轮询它,就像轮询和中断之间的区别一样。

这可能吗?

【问题讨论】:

    标签: triggers nosql redis


    【解决方案1】:

    消息框如何处理?比如2条消息(AND操作)可以触发另一条消息,我觉得这可以说明问题?与 JBPM 类似,但并不复杂。

    【讨论】:

    • 也许我们可以在每条消息中添加挂钩,以检查另一条消息在前后是否可用。
    【解决方案2】:

    自 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"
    

    收到事件后,你可以获取更新后的值,看看它是否满足你应用代码中的条件。

    【讨论】:

      【解决方案3】:

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

      特别是对于列表,您有BLPOP,它将阻止连接,直到有新项目可以从列表中弹出。

      【讨论】:

        【解决方案4】:

        您可以使用 Redis 的Pub/Sub 功能。鉴于您所描述的情况,这正是您所需要的。

        本质上,您将SUBSCRIBE 写入“通道”,而应用程序的另一部分写入 (PUBLISH) 正在更改的值到该通道。您的订阅者(消费者,想要了解更改的客户)将收到几乎实时的通知。

        【讨论】:

        • 感谢您的回答。我已阅读 Redis 的 Pub/Sub 功能的文档,但仍然不明白如何在值更改时触发。谁来做“酒吧”行动?不轮询值,如何触发“Pub”动作?
        • 正在写入值的客户端应发布值已更改。
        • @ciphor 如果我理解你的问题,这个想法是改变你的应用程序逻辑,所以不是(或除此之外)将你的值写入“普通”redis键,而是将它写入频道,以便立即通知每个订阅者(当然可以是一个订阅者)。
        • 好主意,如果firebase支持这样的触发器和存储过程就好了。尤其是异步触发器(在短时间内删除重复操作)
        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 2016-10-15
        • 2016-08-22
        • 2012-02-21
        • 1970-01-01
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多