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

Chr*_*fer 17 redis

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

或者,如果那是不可能的,那么我可以删除最旧的1000个键吗?

Dav*_*ert 10

你现在使用过期吗?如果是这样,如果没有设置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
Run Code Online (Sandbox Code Playgroud)

编辑 正如@kouton所指出的,在生产中使用扫描键,请参阅以下内容的讨论:在Redis中SCAN与KEYS的性能

  • 切勿在生产中使用"钥匙"; 用`scan`代替. (3认同)

Gon*_*alo 6

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

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

  • 我使用空闲时间删除了超过 1 小时的所有内容,如下所示:https://gist.github.com/zioproto/ac434a5067605a4f093d5925c8695ec3 (2认同)

Sav*_*oto 6

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


ptz*_*z0n 5

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

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

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