ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> # 过期key的删除策略 - 当我们给Key设置过期时间时,Redis会将它放到一个独立字典中。那要如何移除过期的Key呢?这里有三种不同的删除策略。 - 定时删除:给这个Key设置过期时间,同时创建一个定时器, 当达到过期时间, 再通过回调删除过期的Key。 - 定期删除:每隔一段时间对独立字典Key进行检查,然后删除过期Key(随机从独立字典里抽查100个Key, 如果这100个中有25%的Key过期了,再次从独立字典里抽查100Key,直至过期Key低于25%,本次检查才结束) - 惰性删除:不主动去删除过期的Key, 等你用到的时候,再去检查这个Key有没有过期, 如果过期了则删除key返回nil。 - 内存占用时间:定时删除 < 定期删除 < 惰性删除 - CPU 占用时间:定时删除 > 定期删除 > 惰性删除吧 - Redis使用的过期键值删除策略是:定期删除 + 惰性删除 > # 内存淘汰机制 - 但是如果仅使用 定期删除 \+ 惰性删除 有可能出现严重的隐患:定期删除时留下很多过期的Key,而且用户长时间没有用到这些过期Key,从而导致过期Key一直堆积在内存里将内存消耗完。这个问题要怎么解决呢?这时候Redis内存淘汰机制应运而生了,Redis提供了如下图内存淘汰策略(内存超过上限时使用什么策略淘汰Key)。 ![](images/up-9107d43652c52b7815b26ebb6f598c36e5b.png) - 默认策略是noeviction不会淘汰内存数据,如果你只是拿Redis做缓存,可以使用 allkeys-xxx 策略,客户端写缓存时就不用携带过期时间了。如果还需要使用Redis的持久化功能, 那就使用 volatile-xxx 策略, 这样没设置过期时间的Key就是永久的。当限制了Redis内存大小,使用内存超过限制时才会触发内存淘汰策略。如果没限制Redis内存大小的话,超出的部分可以保存在磁盘中, 只是存取效率急速下降,达不到最初的效果。 > # 相关阅读 - [内存缓存(cache)常用淘汰算法](https://blog.csdn.net/qq_38293564/article/details/108184926) - [请勿过度依赖Redis的过期监听](https://juejin.cn/post/6844904158227595271)