【问题标题】:Redis: How to delete all keys older than 3 monthsRedis:如何删除所有超过 3 个月的密钥
【发布时间】:2018-08-17 21:27:31
【问题描述】:

我想清除所有超过 3 个月的密钥。这些密钥没有设置过期日期。

或者,如果这不可能,我可以删除最旧的 1000 个键吗?

【问题讨论】:

  • 不幸的是,这是不可能的。但是您可以根据其中关联的数据删除 Redis 键。
  • @LeonidBeschastny 谢谢。是不是因为密钥没有按排序方式存储或保存日期?
  • 除非您自己将其存储在与之关联的数据中,否则无法获取密钥创建时间。对于最旧的键,Redis 针对快速键值访问进行了优化,因此将其数据存储为哈希表。

标签: redis


【解决方案1】:

使用对象 idletime 可以删除三个月以来未使用的所有键。这不完全是你问的。如果您在 6 个月前创建了一个密钥,但每天都访问该密钥,则 idletime 会更新,此脚本不会将其删除。我希望脚本可以提供帮助:

#!/usr/bin/env python
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("*"):
    idle = r.object("idletime", key)
    # idle time is in seconds. This is 90days
    if idle > 7776000:
        r.delete(key)

【讨论】:

    【解决方案2】:

    您是否现在使用过期时间?如果是这样,如果没有设置 TTL,则可以循环遍历所有键,然后添加一个。

    Python 示例:

    for key in redis.keys('*'):
        if redis.ttl(key) == -1:
            redis.expire(key, 60 * 60 * 24 * 7)
            # This would clear them out in a week
    

    编辑 正如@kouton 指出的那样,在生产中使用扫描键,请参阅以下讨论:SCAN vs KEYS performance in Redis

    【讨论】:

    • 永远不要在生产中使用keys;请改用scan
    【解决方案3】:

    有点晚了,但请查看 OBJECT 命令。在那里您会发现对象空闲时间(分辨率为 10 秒)。它用于调试目的,但仍然可以满足您的需求。

    参考:http://redis.io/commands/object

    【讨论】:

    【解决方案4】:

    抱歉,这是不可能的,正如上面的 cmets 所述。在 Redis 中,创建自己的索引以支持您的访问模式至关重要。

    提示:您应该做的是使用所有新的或修改的键创建一个排序集 (ZADD),并将分数设置为时间戳。这样您就可以使用ZRANGEBYSCORE 在一段时间内轻松获取密钥。

    如果您想使现有密钥过期,get all keys(昂贵)并使用EXPIRE 命令为每个密钥设置一个 TTL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-01
      • 2018-01-31
      • 2015-12-18
      • 1970-01-01
      • 2022-10-07
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多