2013-05-13 46 views
11

我想清除所有超过3个月的密钥。这些密钥没有设置过期日期。Redis:如何删除所有超过3个月的密钥

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

+0

不幸的是,这是不可能的。但是您可以根据其中关联的数据删除Redis密钥。 – 2013-05-13 10:13:45

+0

@LeonidBeschastny谢谢。这是因为密钥没有以有序方式存储或保存日期? – Christoffer 2013-05-13 11:04:16

+3

除非您自己将其保存在与其关联的数据中,否则无法获取创建密钥的时间。至于最老的密钥,Redis针对快速键值访问进行了优化,因此它将其数据存储为散列表。 – 2013-05-13 11:20:13

回答

5

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

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

如果您希望过期现有的密钥get all keys(昂贵),并使用EXPIRE命令为每个密钥设置一个TTL。

4

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

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

+0

有什么办法从StackExchange.Redis.Extention Api执行这个命令? – 2016-07-14 07:15:29

6

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

+2

千万不要在生产中使用'keys';使用'scan'代替。 – kouton 2017-11-23 04:52:24