【问题标题】:Redis as cache - reset expiryRedis 作为缓存 - 重置到期
【发布时间】:2014-01-13 12:19:06
【问题描述】:

我正在使用 redis 作为缓存,并希望使 redis 中未积极使用的数据过期。目前,为对象设置过期时间会在过期时间过后删除对象。但是,如果在对象过期之前至少读取一次,我想将对象保留在 redis 中。

我看到的一种方法是为每个对象存储一个单独的 expiry_key,并将到期设置为 expiry_key 而不是原始对象。在 expiry_key 上订阅 del 通知,当收到 del 通知时,检查是否在过期间隔期间至少读取了一次对象(通过单独维护的访问日志)。如果没有读取对象,则对原始对象执行 del 命令。如果已读取,则重新创建具有到期间隔的 expiry_key。

此实现需要额外的系统来管理过期,并且更愿意使用 redis 在本地执行此操作。

有没有更好的解决方案来解决这个问题?

为每次读取重置对象的到期时间会增加对 redis 的写入次数,因此这不是一个选择。

请注意,redis 缓存刷新是通过更改通知系统异步管理的。

【问题讨论】:

    标签: caching redis


    【解决方案1】:

    您可以在每次读取后再次设置到期密钥(在密钥上设置 TTL O(1))。

    您的系统在事务中执行此操作可能有意义:

    MULTI
    GET mykey
    EXPIRE mykey 10
    EXEC
    

    您还可以通过管道传输命令。

    official documentation 中也描述了这种模式。

    【讨论】:

    • 嗨,Agis,感谢您的回复。我从 Slave 实例读取并从不同的组件写入 Master 实例。因此,我可能无法利用交易或管道。我们可以异步写入master,但这会大大增加对redis的写入次数。
    • @vinoths 你确定这些额外的EXPIREs 会成为问题吗?正如我所说,在恒定时间内运行,它们对 Redis 来说应该没问题。
    【解决方案2】:

    参考http://redis.io/topics/config中的“将Redis配置为缓存”一节

    我们可以将 maxmemory-policy 设置为 allkeys-lru 以清除 redis 中的非活动内容。这适用于我所说的用例。

    【讨论】:

      【解决方案3】:

      另一种方法是在 key 上定义一个通知,然后重置它的过期时间

      see here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-20
        • 2013-04-16
        • 2017-06-16
        • 1970-01-01
        • 1970-01-01
        • 2014-07-14
        • 2015-06-07
        相关资源
        最近更新 更多