我想清除超过3个月的所有密钥。这些密钥未设置过期日期。
如果那是不可能的,我可以删除最早的1000个密钥吗?
答案 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秒分辨率)。它用于调试目的,但仍然可以为您的需要提供一个很好的解决方法。
答案 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)