【问题标题】:Redis Keyspace Notifications subscription for field&value字段和值的 Redis 键空间通知订阅
【发布时间】:2022-01-02 09:21:59
【问题描述】:

我目前正在处理 Redis 过期事件

我的目标:在 Redis 中的数据已经过期后,在下一个流程中获取 Value、Field 做某事

所以我找到了 Redis Keyspace 通知功能 允许客户端订阅 Redis 中的频道以接收影响重置中数据的事件,例如过期

所以我有一些示例代码:https://github.com/toygame/nodejs-redis-keyspace-notifications

subscriber.subscribe("__keyevent@0__:expired")
subscriber.on('message', async(channel, message) => {
        // do somethings
        console.log(message);       
    })

Result : Key0

这项工作找到了,但我得到的结果只是我设置到 redis 中并过期的 Key

我已经做了一些研究 https://medium.com/nerd-for-tech/redis-getting-notified-when-a-key-is-expired-or-changed-ca3e1f1c7f0a

但它发现的唯一事件可能是我可以作为结果而不是值,我期望的字段

他们无论如何要获得那些价值和领域?

仅供参考。文档https://redis.io/topics/notifications

更新 根据这个https://stackoverflow.com/a/42556450/11349357

键空间通知不报告值,仅键的名称和/或执行的命令包含在发布的消息中。这样做的主要基础原因是 Redis 值可能变得非常大。

如果你真的真的需要这种行为,那其实很简单。由于键空间通知使用 Pub/Sub 消息,因此您可以在每次相关操作后自己调用 PUBLISH,并使用您感兴趣的信息。

看起来我不能使用这个 Redis 密钥空间,但我必须自己发布它

【问题讨论】:

    标签: redis publish-subscribe subscribe ioredis


    【解决方案1】:

    您可以使用RedisGears 处理键空间通知并获取键和值。

    您可以在 python 中编写处理代码并将其注册到 Redis。 例如捕获每个键空间事件并存储到 Stream

    GearsBuilder() \
    .foreach(lambda x: execute('XADD', "notifications-stream", '*', *sum([[k,v] for k,v in x.items()],[]))) \
    .register(prefix="person:*", eventTypes=['hset', 'hmset'], mode='sync')
    

    您可以在此处阅读有关此示例的更多信息:https://oss.redis.com/redisgears/examples.html#reliable-keyspace-notification

    【讨论】:

    • 现在我正在使用 Keyspace 通知,担心使用订阅时重复键是 RedisGears 可能解决这个问题吗?
    • 重复键是什么意思?
    • 我目前正在使用 Redis Keyspace Notification 来发布过期密钥,当它过期时,然后在另一边订阅,所以它将是 1 个密钥作为输出,所以我关心的是当我们进行水平缩放订阅时得到扩展,它会像 10 个订阅,然后我得到 10 个密钥
    • 如果您使用 Gears 使用单个键重新注册,那么您将只会获得一个 Exipre 事件。
    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多