【问题标题】:REDIS: Automatically set expiry of newly added keysREDIS:自动设置新添加密钥的到期时间
【发布时间】:2018-01-17 20:59:05
【问题描述】:

我目前正在研究如何更有效地使用 redis。

在互联网上进行研究后,我发现有效利用 Redis 的方法之一是为服务器上创建的所有密钥设置过期时间。 我目前正在将 Java 程序中的数据加载到 Redis 中,但是我不想从 Java 程序中设置 EXPIRE 命令,而是想在服务器端设置所有键的到期时间。

我想知道是否有任何方法可以设置任何新的密钥(或所有密钥)添加到 REDIS 服务器,到期时间为 10 分钟。目前,EXPIRE 命令需要您提供特定的密钥。

我的一个想法是创建一个 LUA 脚本,它使用 TTL 扫描所有键。如果 TTL 为 -1,则设置到期时间。不过,这个脚本必须定期运行。

另一个问题,有没有更好/更有效的方法来做到这一点?

提前致谢。

【问题讨论】:

    标签: lua redis stackexchange.redis


    【解决方案1】:

    您可以创建一个脚本来执行类似的操作以在一周内删除所有键(python):

    for key in redis.keys('*'):
        if redis.ttl(key) == -1:
            redis.expire(key, 604800)
    

    【讨论】:

    • 谢谢。你的想法和我的很相似——希望我的是用 LUA 编写脚本。但是出于兴趣,是否有替代方法可以轮询此脚本 x 分钟?
    • 小心,keys 命令在 O(n) 中运行,其中 n 是数据库中的键数。它会破坏redis的性能。文档警告不要在应用程序代码中使用它:redis.io/commands/keys
    • 谢谢大家。有用的信息。我假设如果使用 SCAN 而不是 KEYS,则可以接受轮询脚本。
    • @rm12345 我不相信这种方法。定期扫描所有键不是很有效(尽管比使用 keys 命令更好)。在创建它们之后将过期设置为每个键可能更好吗?假设您从一个空数据库开始并且对 other approach 不感兴趣
    • @MarioTrucco 在添加密钥时设置过期是我最初喜欢的...只是我试图避免在 Java 端设置 EXPIRE 而更喜欢在 REDIS 服务器上设置它边。除非您对如何完成有任何想法? (在网上看了之后,我看不到这样的信息)
    【解决方案2】:

    您可以设置内存限制,当达到该限制时,所有键都将被逐出。这可能会也可能不会回答您的问题,因为您实际上并不控制 TTL

    来自docs:

    如果您打算将 Redis 用作缓存,其中每个键都有一个 expire set,你可以考虑改用下面的配置 (假设最大内存限制为 2 兆字节):

    maxmemory 2mb
    maxmemory-policy allkeys-lru
    

    另请参阅Using Redis as an LRU cache 上的详细说明:它表明allkeys-lru 比设置过期更节省内存。在同一个文档中,您还可以尝试使用 volatile-ttl 策略而不是 allkeys-lru;这更接近你想要的

    【讨论】:

    • 没错。另请查看 v4 中引入的新 LFU 模式
    【解决方案3】:

    作为其他答案的替代方案,如果您只想保存额外的命令,并且只执行基本的SETs,那么SETEX 命令是SET 的组合EXPIRE 可能就是你要找的东西。

    https://redis.io/commands/setex

    SETEX key seconds value

    【讨论】:

      【解决方案4】:

      在 redis-cli 中,您可以执行以下操作:

      SETEX keyhere seconds valuehere //nnog's example above
      SET keyhere valuehere EX seconds   //extended version
      

      在处理实时数据时会派上用场。

      但是,请记住,Redis 将来可能会弃用 SETEX。

      据他们说:

      注意:由于 SET 命令选项可以替代 SETNX、SETEX、PSETEX,因此在未来的 Redis 版本中,这三个命令可能会被弃用并最终被删除。

      链接:https://redis.io/commands/set

      【讨论】:

        猜你喜欢
        • 2016-05-15
        • 1970-01-01
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        • 2018-12-03
        • 2014-08-24
        • 2021-01-27
        • 2017-05-05
        相关资源
        最近更新 更多