redis如何过期密钥?

时间:2016-03-23 08:08:09

标签: redis

Redis如何实现密钥的到期?从here开始,我了解到Redis会存储密钥到期的时间,但具体如何实现?

3 个答案:

答案 0 :(得分:68)

简而言之 - 对于每个redis对象,都有一个到期时间。除非您将对象设置为过期,否则该时间为“从不”。

现在,到期机制本身是半懒惰的。延迟到期意味着在读取对象之前实际上不会使对象到期。在读取对象时,我们检查它的到期时间戳,如果它在过去,我们什么都不返回,并在我们处理时删除该对象。但问题是如果一个键永远不会被触及,它就会毫无理由地占用内存。

因此Redis增加了第二层随机主动过期。它只是随机读取随机密钥,当触摸过期密钥时,它会根据惰性机制被删除。这不会影响到期行为,它只会添加过期密钥的“垃圾收集”。

当然实际的实现比这更复杂,但这是主要的想法。

您可以在此处详细了解:http://redis.io/commands/expire

可以在此处找到有效到期周期的源代码:https://github.com/antirez/redis/blob/unstable/src/server.c#L781

答案 1 :(得分:2)

对于Redis 6,来自发行说明:

有效期已在Redis 6.0中重写,以允许更多 更快的到期时间,更接近生存时间(TTL) 属性。 Redis 6到期将不再基于随机 采样,但是将采用radix tree

中按过期时间排序的键

答案 2 :(得分:0)

来自reference

  

Redis密钥以两种方式过期:被动方式主动   方式

     

仅当某些客户端尝试访问密钥时,密钥才会被动失效,   并且发现密钥超时。

     

当然这还不够,因为有过期的密钥永远不会   再次被访问。这些密钥无论如何都应该过期,所以   Redis定期在密钥之间随机测试几个密钥,   到期集。所有已过期的密钥将从中删除   键空间。

     

这是Redis每秒执行10次的操作:

     

测试一组键中有关联失效的20个随机键。   删除找到的所有密钥已过期。如果超过25%的密钥是   过期,请从第1步重新开始。这是微不足道的概率   算法,基本上是假设我们的样本是   代表整个密钥空间,并且我们一直持续到   可能过期的密钥百分比低于25%

     

这意味着在任何给定时刻,最大数量的键已经   使用内存的过期时间最大等于最大写入量   每秒的操作数除以4。