cover_image

这几个缓存淘汰算法你知道吗?

flyhero 码上实战
2019年12月29日 10:00
图片
图片

码上实战

理论实践相结合,做个好好学习的宝宝!^_^

图片
图片

关注

为什么需要缓存?

因为我们从磁盘中读取文件的速度相较于读取内存中的数据的速度是比较慢的,因此我们将常用的数据存入内存中(我们称之为缓存),以此来加快数据的读取速度。

为什么要淘汰缓存

这个很简单,就是因为我们现在服务器内存有限,不可能不断的将数据存入内存中而不淘汰。况且Java应用会有GC问题,过多的使用内存会造成频繁的FullGC,从而导致应用停顿。我们要做到就是通过淘汰算法让存入内存中的数据能发挥最大价值。

常用算法

FIFO(先进先出)

先进先出算法,很容易理解,核心原则是:先进行缓存的数据先淘汰掉。

实现方式:使用队列来完成。

图片

维度描述
命中率
复杂度简单
存储成本
缺陷速度快,但使用价值不高

LRU(最近最少使用)

最近最少使用可以理解为:最近一段时间最少被访问的数据淘汰掉。

实现方式:一般使用链表完成。

图片

维度描述
命中率较高
复杂度较简单
存储成本一般
缺陷速度较慢,需要遍历链表;仅从时间上考虑,没有考虑频率

LFU(最不经常使用)

最不经常使用:基于最近访问频率来进行淘汰。

实现方式:一般使用Map完成。

图片

维度描述
命中率比LRU较高
复杂度较高
存储成本需要维护所有的访问记录的频率数据结构
缺陷仅考虑频率

推荐阅读

(点击标题可跳转阅读)

Java8 接口改变:静态方法与默认方法

为什么我要使用Optional ?

继续滑动看下一个
码上实战
向上滑动看下一个