Not*_*fer 86
简而言之 - 对于每个redis对象,都有一个到期时间.除非您将对象设置为过期,否则该时间为"从不".
现在,到期机制本身就是半懒惰的.延迟到期意味着在读取对象之前实际上不会使对象到期.在读取对象时,我们检查它的到期时间戳,如果它在过去,我们什么都不返回,并在我们处于对象时删除该对象.但问题是如果一个键永远不会被触及,它就会毫无理由地占用内存.
因此Redis添加了第二层随机主动到期.它只是一直读取随机密钥,当触摸过期密钥时,它会根据惰性机制被删除.这不会影响到期行为,它只是添加过期密钥的"垃圾收集".
当然实际的实现比这更复杂,但这是主要的想法.
您可以在此处阅读更多相关信息:http://redis.io/commands/expire
有关活动到期周期的源代码可以在这里找到:https://github.com/antirez/redis/blob/unstable/src/server.c#L781
Ami*_*aei 15
对于 Redis 6,来自发行说明:
Redis 6.0 中的过期周期已被重写,以允许更快的过期,更接近于生存时间 (TTL) 属性。Redis 6 过期将不再基于随机抽样,而是采用基数树中 按过期时间排序的键
— Redis 6 发行说明
完整的发行说明在这里。
从参考:
Redis 密钥以两种方式过期:被动方式和主动方式。
当某个客户端尝试访问它时,密钥就会被动地过期,并且发现该密钥已超时。
当然,这还不够,因为存在永远不会再次访问的过期密钥。这些键无论如何都应该过期,因此 Redis 会定期在具有过期设置的键中随机测试一些键。所有已经过期的键都从键空间中删除。
具体来说,Redis 每秒执行 10 次:
从具有关联过期的密钥集中测试 20 个随机密钥。删除所有发现过期的密钥。如果超过 25% 的密钥过期,则从步骤 1 重新开始。 这是一个平凡的概率算法,基本上假设我们的样本代表整个密钥空间,我们继续过期,直到密钥的百分比可能过期低于 25%
这意味着在任何给定时刻,使用内存的已过期键的最大数量最大等于每秒最大写入操作数量除以 4。
| 归档时间: |
|
| 查看次数: |
26118 次 |
| 最近记录: |