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

Redis:如何删除所有超过3个月的密钥,redis,Redis,我想冲掉所有超过3个月的钥匙。这些密钥未设置过期日期 或者如果不可能,我可以删除最旧的1000个密钥吗?抱歉,这是不可能的,正如上面的评论所述。在Redis中,创建自己的索引以支持访问模式至关重要 提示:您应该做的是创建一个包含所有新键或修改键的排序集(ZADD),并将分数设置为时间戳。这样,您可以使用ZRANGEBYSCORE轻松地在一段时间内提取密钥 如果要使现有密钥过期(昂贵),请使用expire命令为每个密钥设置一个TTL。稍晚一点,但请检查OBJECT命令。在那里,您将发现对象空闲时间

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


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

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

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


如果要使现有密钥过期(昂贵),请使用
expire
命令为每个密钥设置一个TTL。

稍晚一点,但请检查OBJECT命令。在那里,您将发现对象空闲时间(分辨率为10秒)。它用于调试目的,但仍然是一个很好的解决方案,可以满足您的需要

参考资料:

您现在是否正在使用expire?如果是这样的话,如果没有设置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所指出的,在生产中使用对密钥的扫描,请参阅下面的讨论:

使用对象空闲时间,您可以删除三个月以来未使用过的所有密钥。这不完全是你所要求的。如果您在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)

不幸的是,这是不可能的。但您可以根据Redis密钥中关联的数据删除它们。@LeonidBeschastny谢谢。这是因为密钥没有以排序方式存储或与日期一起保存吗?除非您自己将其存储在与之相关的数据中,否则无法获取密钥创建的时间。对于最旧的密钥,Redis针对快速键值访问进行了优化,因此它将其数据存储为哈希表。是否有任何方法可以从StackExchange.Redis.Extension Api执行此命令?我使用idletime删除超过1小时的所有内容,如下所示:绝不在生产中使用
密钥
;改为使用
scan