Redis如何实现键的过期?我从这里了解到,Redis存储键过期的时间,但具体是如何实现的呢?
对于Redis 6,从发布说明中可以看到:
Redis 6.0中的过期周期已被重写,以允许更快的过期,更接近生存时间(TTL)属性。Redis 6过期将不再基于随机采样,而是将按过期时间排序的键放入基数树中进行处理。
— Redis 6发布说明
要获取完整的发布说明,请单击此处。
从参考文献中得知:
Redis的键有两种过期方式:被动方式和主动方式。
当某个客户端尝试访问一个已超时的键时,这个键就会被 passively expired。
当然仅此是不够的,因为有一些已经超时的键可能再也不会被访问到。因此,Redis 会定期随机测试一些带有过期时间的键,无论这些键是否被访问过,都将它们设置为过期状态并从 key空间中删除这些已过期的键。
具体来说,Redis 每秒钟执行以下操作10次:
从带有 expire 属性的键集合中随机选择20个键进行测试,删除所有已过期的键。如果过期键的数量超过25%,则重新从第1步开始执行。这是一种简单的概率算法,基本上假设我们的样本代表整个键空间,我们会继续过期操作,直到可能已过期的键的百分比低于25%。
这意味着在任何给定时刻,使用内存的已过期最大键数等于每秒最大写入操作数除以4。
y
键。否则,随着时间的推移,它将指向其他内容。 - Valentin V