FIFO先进先出算法
FIFO(First in First out)先进先出。可以理解为是一种类似队列的算法实现。
算法:如果一个数据最先进入缓存中,则应该最早淘汰掉。
换句话说:最先进来的数据,被认为在未来被访问的概率也是最低的, 因此,当规定空间用尽且需要放入新数据的时候,会优先淘汰最早进来的数据。
演示:
下面简单演示了FIFO的工作过程,假设存放元素尺寸是3,且队列已满,放置元素顺序如下图所示。当来了一个新的数据“ldy”后,因为元素数量到达了阈值,则首先要进行淘汰置换操作,然后加入新元素, 操作如图展示:
优点:最简单、最公平的一种数据淘汰算法,逻辑简单清晰,易于实现
缺点:这种算法逻辑设计所实现的缓存的命中率是比较低的,因为没有任何额外逻辑能够尽可能的保证常用数据不被淘汰掉
LRU —— 适用于局部突发流量场景
LRU(The Least Recently Used)最近最少使用淘汰算法(最近最久未使用淘汰算法)。
算法:
如果一个数据最近很少被访问到,那么被认为在未来被访问的概率也是最低的,当规定空间用尽且需要放入新数据的时候,会优先淘汰最久未被访问的数据
演示:
下图展示了LRU简单的工作过程,访问时对数据的提前操作,以及数据满且添加新数据的时候淘汰的过程的展示如下:
优点:
LRU 实现简单,在一般情况下能够表现出很好的缓存命中率,是一个“性价比”很高的算法。LRU可以有效的对访问比较频繁的数据进行保护,也就是针对热点数据的命中率提高有明显的效果。LRU局部性突发流量场景,对突发性的稀疏流量(sparse bursts)表现很好。
缺点:
在周期性的局部热点 数据场景,有大概率可能造成缓存污染。缓存命中率不高 。
具体来说:最近访问的数据,并不一定是周期性访问的数据, 比如把全量的数据做一次迭代,那么LRU会产生较大的缓存污染,因为周期性的局部热点数据,可能会被淘汰。
总之
如上所述,对于偶发性、周期性的数据没有良好的抵抗力,很容易就造成缓存的污染,影响命中率。