一、什么是 Buffer Pool?
缓冲池,简单来说就是一块内存区域。为了避免每次都去访问磁盘,把最常访问的数据放在缓存里,提高数据的访问速度。
二、预读机制
为了进一步提高IO效率,缓冲池还采用了预读机制。 当读取某些数据时,系统会预测这些数据周围的数据也可能会被使用到,于是提前将这部分数据加载到缓冲池中。 这样一来,就可以减少未来可能的磁盘IO操作,进一步提高数据处理速度。
三、预读失效
在进行预读时,缓冲池会加载大量的数据页,从而导致缓冲池中已存在的常用的数据页替换出去,造成缓冲池污染
此时会通过淘汰策略来将一些数据合理的淘汰清除掉,接下来介绍一些常用的淘汰策略
四、淘汰策略
缓存淘汰算法是指在有限容量的列表中,空间被占满后要存入新的数据时,决定哪个数据应该被剔除的一类算法。常见的缓存淘汰算法有LFU、LRU、ARC、FIFO等几种
1.LFU
LFU (Least Frequently Used):最近最不常用算法,根据数据的历史访问频率来淘汰数据。Frequently 为频率的意思
对于每一个数据条目,都有使用次数cnt
删除策略:优先删除使用次数(也就是频率)cnt最小的数据
执行过程:
1.在缓存中查找客户端需要的数据
2.如果缓存命中,则将数据从数据队列中取出,并且将该数据的使用次数cnt加一,然后将其放在使用次数cnt相同的数据队列最前面
3.如果没有命中缓存,则会从数据库中查询数据,并将其放入缓存队列的尾部,使用次数cnt记为1
4.如果缓存满了,则淘汰掉位于缓存队列最尾部使用次数cnt最小的数据,然后再将新数据放入缓存队列尾部,使用次数cnt记为1
存在的问题:
1.刚进入缓存的新数据可能很快就会再次被删除,因为它们的使用次数cnt较低,即使之后可能会频繁使用
2.一些数据在某个短时间内被大量使用,cnt急剧增加,并且在后面很长一段时间不会被使用,但由于cnt比较大,会导致这个这个数据在很长一段时间内不会被淘汰掉
2.LRU
LRU (Least Recently User):最近最少使用算法,根据数据的历史访问记录来进行淘汰数据。Recently 为最近的意思
对于每一条数据条目,都有自上次被访问内以来所经历的时间time
删除策略:优先删除最久没使用的数据,即time值最大的数据
执行过程:
1.在缓存中查找客户端需要的数据
2.如果缓存命中,则将数据从数据队列中取出,并将其放在缓存队列的头部
3.如果没有命中,则从数据库查询数据,并将其放入缓存队列的头部
4.如果缓存队列满了,则淘汰队列尾部的缓存数据,即time值最大的数据
存在的问题:
可能会造成缓冲池污染,将一些使用次数cnt值大的数据给淘汰掉
3.ARC
ARC:自适应替换缓存算法,结合了LRU和LFU的优点。
简单来说就是淘汰掉最近最不常使用和使用频率最小的数据
4.FIFO
FIFO:先进先出算法,淘汰最早进入缓存的数据项。
删除策略:淘汰掉最早进入缓存队列的数据
执行过程:
1.缓存中利用双向链表保存数据
2.新进来的数据放到链表的末尾
3.如果缓存满了,则淘汰掉链表头部的数据
4.客户端访问数据时,存在该数据,会返回对应的value值
存在的问题:
如果最先进入缓存的数据是最常用的数据,则会导致最常用的数据被淘汰掉,效率低
总结
此外,缓存淘汰策略还有MRU、2Q和NMRU,这里不做过多解释。