常用缓存淘汰算法LFULRU2QARC

Posted 惜暮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用缓存淘汰算法LFULRU2QARC相关的知识,希望对你有一定的参考价值。

常用缓存淘汰算法LFU、LRU、2Q、ARC

LRU

LRU(Least Recently Used) 是一种使用广泛的缓存数据替换策略,目的是在有限的内存空间中尽可能保留最有价值的缓存数据。 其核心本意是,在资源出现不足时,剔除掉最近最少使用的数据,为新数据提供存放空间。

LRU 的理念就是剔除掉最近使用最少使用的数据。 如果某份数据刚被使用,那么就认为它近期还可能被使用,且使用概率大于相对旧的数据,这和计算机的时间局部性内涵一致。最近最少使用的数据,应该为最近较多使用的数据让出空间。

LRU 的核心缺陷是: 冷数据可以顶掉热数据,数据的替换策略并未考虑数据的冷热程度,只按照新近访问时间作为淘汰依据。在偶发性的扫描(遍历)场景下,会让冷数据污染缓冲区,使得效率下降。

LFU

LFU(Least Frequently Used) 算法会追踪数据的访问频率,选择访问次数最低的进行淘汰,这种想法很好的考虑了数据真实的局部性,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小,这种淘汰策略更加贴近真实的使用场景。不过这种策略不能够即时的跟上新的热点变化,老数据占的坑不能快速地移交给新的热点,在适应性上较差。

一般情况下,LFU效率要优于LRU,且能够避免周期性或者偶发性的操作导致缓存命中率下降的问题,但LFU需要记录数据的历史访问记录,一旦数据访问模式改变,LFU需要更长时间来适用新的访问模式,即LFU存在历史数据影响将来数据的"缓存污染"问题。

2Q

2Q:2Q的是用一个简单的LRU list作为frequent 队列。但是2Q有很严重缺点,因为它需要两个可调参数:Kin和Kout。为什么可调参数一个很严重的限制?这是我们在实施一个系统时,必须确定这些参数,而且不可更改。一旦确定了一组参数,这个缓存系统往往只能对某一类workload表现很好。也就是这种缓存系统缺少了自适应性。

ARC

adaptive replacement cache:

  1. 一种自适应,低成本的淘汰算法
  2. 它集合了LRU和LFU的优点,并且没有额外的使用和实现成本。
  3. 它可以更具workload的改变而自动的改变淘汰策略。
    具体的策略如下:
  4. 整个Cache分成两部分,起始LRU和LFU各占一半,后续会动态适应调整partion的位置(记为p)
  5. 除此,LRU和LFU各自有一个ghost list(因此,一共4个list)
  6. 每次,被淘汰的item放到对应的ghost list中(ghost list只存key), 例如:如果被evicted的item来自LRU的部分, 则该item对应的key会被放入LRU对应的ghost list
  7. 第一次cache miss, 则会放入LRU
  8. 如果cache hit, 如果LFU中没有,则放入LFU
  9. 如果cache miss, 但在ghost list中命中,这说明对应的cache如果再大一丁点儿就好了: 如果存在于LRU ghost list, 则p=p+1;否则存在于LFU ghost list, p=p-1.
  10. 也就是说,利用这种适应机制,当系统趋向于访问最近的内容,会更多地命中LRU ghost list,这样会增大LRU的空间; 当系统趋向于访问最频繁的内容,会更多地命中LFU ghost list,这样会增加LFU的空间.

以上是关于常用缓存淘汰算法LFULRU2QARC的主要内容,如果未能解决你的问题,请参考以下文章

缓存淘汰算法-LRU 实现原理

缓存淘汰算法-LRU 实现原理

缓存淘汰算法-LRU 实现原理

缓存机制

缓存淘汰算法系列

昨天面试被问到的 缓存淘汰算法FIFOLRULFU及Java实现