Redis如何实现密钥的到期?从here开始,我了解到Redis会存储密钥到期的时间,但具体如何实现?
答案 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。