23

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

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

4

4 回答 4

24

使用对象 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)
于 2018-08-17T13:27:31.383 回答
14

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

于 2014-09-25T08:23:50.250 回答
7

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

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

于 2014-04-19T22:41:16.570 回答
4

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

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

如果要使现有密钥过期,请获取所有密钥(昂贵)并使用该EXPIRE命令为每个密钥设置一个 TTL。

于 2013-05-13T13:01:54.827 回答