gpt4 book ai didi

Redis 在 key 过期时更新排序集

转载 作者:行者123 更新时间:2023-12-03 06:37:33 25 4
gpt4 key购买 nike

我有一个 Redis 服务器,其中包含一组键值对和一个排序集,提供这些键值对的键的索引。
键值对可以进入“完成”状态,此时需要在 1 小时后将其删除。
这可以通过在 key 上设置过期时间来简单地实现,但是从排序集中清除它们似乎更有问题。
我可以有一个过程来扫描集合并不时更新它们,但如果有一些更清洁的东西会很好。
我不认为有一种方法可以在到期时触发存储过程之类的东西,或者在排序后的设置值上设置到期时间。
我错过了什么,或者是手动的唯一方法?

最佳答案

您是对的,您不能对已排序的设置值本身“设置过期时间”。
但是您可以使用主键并在到期时捕获事件。您至少有两种方法可以实现这一目标:

  • 使用 Key Space Notification
  • 使用 Redis Gears

  • key 空间通知
    使用 key 空间通知,您可以捕获将发送 PUBLISH 消息的 EXPIRE 事件,然后您可以使用该消息。
    让我解释一下基本流程:
    配置通知
    CONFIG SET notify-keyspace-events Ex
  • 邮箱 : 键上发生的事件
  • x : 捕获过期事件

  • 现在您的数据库将在 __key*__:* 上发布一个事件 channel 。
    所以你可以构建一个服务来监听这些事件更新集合(直接或间接):
    psubscribe __key*__:*
    如果您的应用程序设置了以下值和到期时间
    set foo bar EX 5
    您应该会收到以下消息
    1) "pmessage"
    2) "__key*__:*"
    3) "__keyevent@0__:expired"
    4) "foo"
    Redis 齿轮
    使用 Redis Gears,您可以捕获相同的事件(它也基于通知),但直接在您的 Redis 数据库中编写代码更容易。
    您可以按如下方式创建 Gears:(这是一个 Python 脚本,我正在使用 RedisInsight 将其部署到 Redis)
    def process(x):
    execute('LPUSH', 'expired:keys', x['value']['key']);

    # Capture an expiration event and adds it to 'expired:events' stream
    cap = GB('KeysReader')
    cap.foreach(lambda x:
    execute('XADD', 'expired:events', '*', 'key', x['key']))
    cap.register(prefix='*',
    mode='sync',
    eventTypes=['expired'],
    readValue=False)

    # Consume new messages from expiration streams and process them somehow
    proc = GB('StreamReader')
    proc.foreach(process)
    proc.register(prefix='expired:*',
    batch=100,
    duration=1,
    trimStream = False)

    查看以 cap = GB('KeysReader') 开头的部分
  • 这将监听任何 key 到期prefix='*' & eventTypes=['expired']
  • 如果过期,它将向 'expired:events' 添加一条消息Redis Stream 使用 XADD 命令
  • 然后看函数proc = GB('StreamReader')将处理流
  • 每次流中有新消息时,它将调用 process()功能。

  • 您可以添加逻辑以更新此函数中的排序集。在我的示例中,我刚刚将过期 key 添加到列表中。

    让我与您最初的问题有所不同。
    看起来您正在使用 Sorted Set 为您的数据创建某种形式的索引。
    如果是这种情况,您应该查看 RediSearch,另一个允许您索引 的 Redis 模块哈希 字段,然后使用索引进行一些高级查询和聚合。
    使用 RediSearch,您无需添加任何代码来管理索引,它由数据库自动完成,您可以查询字段。
    我邀请你看看:
  • RediSearch module
  • RediSearch Getting Started

  • 抱歉,如果这不是您使用 Sorted Set 的原因,但我认为值得检查,因为如果您今天手动管理索引,可以大大简化您的应用程序代码。

    关于Redis 在 key 过期时更新排序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64338227/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com