缓存淘汰算法 FIFO,LFU,LRU
FIFO,LFU,LRU 是常见的缓存淘汰算法,又称页面置换算法。
FIFO
FIFO 全称 First In, First Out,即先进先出,符合队列特性,数据结构上使用队列 Queue 实现。
- 新访问的数据插入队列尾部
- 淘汰队列头部数据
LFU
LFU 全称 Least Frequently Used,基于数据访问频率(次数),数据结构上使用队列 Queue 实现。
核心思想:如果一个数据在最近一段时间内访问次数很少,则在将来一段时间内被访问的可能性也很小。
缓存的每个数据都有引用计数,所有数据按照引用计数排序,具有相同引用计数的数据按照时间排序。
- 新访问的数据插入队列尾部,引用计数为 1
- 缓存中的数据每次被访问(缓存命中)时,引用计数都会加 1,然后队列根据引用计数重新排列,引用计数越大的数据越靠近队列头部,具有相同引用计数的数据按照时间排序
- 淘汰队列尾部数据
LRU
LRU 全称 Least Recently Used,基于数据访问历史记录,数据结构上使用链表 LinkedList 实现。
核心思想:如果一个数据在最近一段时间内没被访问,则在将来一段时间内被访问的可能性也很小。
- 新访问的数据插入链表头部
- 缓存中的数据每次被访问(缓存命中)时都会被移动到链表头部
- 淘汰链表尾部数据
LFU 和 LRU 对比
- LFU 效率优于 LRU,能够避免周期性或偶发性操作导致缓存命中率下降的问题
- LFU 需要维护一个队列记录所有数据的访问记录,每个数据都要维护引用计数,内存消耗和性能消耗都较高
- LFU 实现比 LRU 复杂