Redis:如何删除超过3个月的所有密钥

时间:2013-05-13 08:11:07

标签: redis

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

如果那是不可能的,我可以删除最早的1000个密钥吗?

4 个答案:

答案 0 :(得分:9)

NOW 使用过期了吗?如果是这样,如果没有设置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

上的讨论。

答案 1 :(得分:6)

有点晚了,但请查看OBJECT命令。在那里你会发现物体空闲时间(10秒分辨率)。它用于调试目的,但仍然可以为您的需要提供一个很好的解决方法。

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:2)

使用对象空闲时间,可以删除三个月以来未使用的所有密钥。这不完全是您的要求。如果您在6个月前创建了密钥,但是每天都会访问该密钥,则更新空闲时间,并且此脚本不会删除它。我希望该脚本可以提供帮助:

#!/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)