我想清除所有超过 3 个月的钥匙。这些密钥没有设置过期日期。
或者,如果这不可能,我可以删除最旧的 1000 个密钥吗?
使用对象 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)
您现在使用过期吗?如果是这样,如果没有设置 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
有点晚了,但请查看 OBJECT 命令。在那里您会发现对象空闲时间(分辨率为 10 秒)。它用于调试目的,但仍然可以满足您的需求。
对不起,这是不可能的,如上面的评论中所述。在 Redis 中,创建自己的索引以支持您的访问模式至关重要。
提示:您应该做的是ZADD
使用所有新的或修改的键创建一个排序集 ( ),并将分数设置为时间戳。这样,您可以使用ZRANGEBYSCORE
.
如果要使现有密钥过期,请获取所有密钥(昂贵)并使用该EXPIRE
命令为每个密钥设置一个 TTL。