缓存那些事之缓存更新、失效以及内存淘汰策略
前言
缓存应该是技术人员最常见的一个词了,但是或许不是所有人都能准确的说出缓存本质是什么,又适用于什么情况,可能遇到哪些问题,应该怎么来解决。下面我就分三篇文章来给大家详细介绍下缓存相关的知识。疏漏不足之处,也请指正,不胜感激。
《缓存那些事之初识缓存》
《缓存那些事之缓存更新、失效以及内存淘汰策略》
《缓存那些事之常见问题与解决方案》
缓存更新策略
缓存更新策略是指在数据需要发生变更的时候,如何来更新目标数据和缓存的方法。可别小看缓存更新策略!要是没有使用正确的缓存更新策略,我们缓存中的数据很容易就变脏了,而且还会一直这样脏下去。
具体可以看这两篇文章,介绍得还是很详细和明白的,这里就不赘述了。
《缓存更新的套路》
《缓存使用过程中的五种策略总结及优缺点组合分析》
缓存过期策略
缓存过期策略是指缓存过期后,我们如何来处理这些过期的数据。过期策略通常有以下三种:
定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
内存淘汰策略
内存淘汰策略是指在我们系统内存不足的时候,如何淘汰掉内存里的某些缓存数据,从而为新的缓存数据腾出空间。这里面也有一些不同的策略的,最常见的就是LFU,FIFO,LRU这三种策略。
事实上,如果大家对操作系统的知识有足够了解的话,就会知道这些策略其实就是操作系统里的页面置换算法。事实上我们宏观系统的很多设计都是来源于这些底层的地方。这些设计模式看起来非常的老古董,但是却又都是历经长时间考验的设计,也就是工程学上所谓的Best Practice,所以要做好架构,把计算机体系结构以及很多老古董的基础技术吃透是非常有帮助的。
继续回到我们的内存淘汰策略:
FIFO(First In First out): 先进先出,最先进来的数据先淘汰,和队列一样。
LRU(Least recently used): 最近最少使用算法,也就是根据访问的历史记录来淘汰,把历史记录最远的淘汰掉。其核心思想是“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”。
LFU(Least frequently used): 最近使用次数最少算法, 淘汰使用次数最少的页面,按照访问次数进行排序,淘汰访问次数最少的,访问次数一样的就按访问时间来。其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。
当然除了这三种策略外,还有很多改进算法,想了解更多的策略可以看这篇文章 《你与解决“缓存污染”只差这篇文章的距离》
参考资料
《Redis的过期策略和内存淘汰策略》
Enjoy it !
如果觉得文章对你有用,可以赞助我喝杯咖啡~
版权声明
转载请注明作者和文章出处
作者: X先生
首发于 https://www.jianshu.com/p/d6140cc4ad01
发表评论 (审核通过后显示评论):