MySQL 缓冲池 Buffer Pool

一、什么是 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,这里不做过多解释。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值