本地缓存Caffeine系列(五)

简介: 本地缓存Caffeine系列(五)

FIFO先进先出算法

FIFO(First in First out)先进先出。可以理解为是一种类似队列的算法实现。

算法:如果一个数据最先进入缓存中,则应该最早淘汰掉。

换句话说:最先进来的数据,被认为在未来被访问的概率也是最低的, 因此,当规定空间用尽且需要放入新数据的时候,会优先淘汰最早进来的数据。

演示:

下面简单演示了FIFO的工作过程,假设存放元素尺寸是3,且队列已满,放置元素顺序如下图所示。当来了一个新的数据“ldy”后,因为元素数量到达了阈值,则首先要进行淘汰置换操作,然后加入新元素, 操作如图展示:


优点:最简单、最公平的一种数据淘汰算法,逻辑简单清晰,易于实现

缺点:这种算法逻辑设计所实现的缓存的命中率是比较低的,因为没有任何额外逻辑能够尽可能的保证常用数据不被淘汰掉

LRU —— 适用于局部突发流量场景

LRU(The Least Recently Used)最近最少使用淘汰算法(最近最久未使用淘汰算法)。

算法:

如果一个数据最近很少被访问到,那么被认为在未来被访问的概率也是最低的,当规定空间用尽且需要放入新数据的时候,会优先淘汰最久未被访问的数据

演示:

下图展示了LRU简单的工作过程,访问时对数据的提前操作,以及数据满且添加新数据的时候淘汰的过程的展示如下:

37a3643556b8606961c70f0788874ea3.png

优点:

LRU 实现简单,在一般情况下能够表现出很好的缓存命中率,是一个“性价比”很高的算法。LRU可以有效的对访问比较频繁的数据进行保护,也就是针对热点数据的命中率提高有明显的效果。LRU局部性突发流量场景,对突发性的稀疏流量(sparse bursts)表现很好。

缺点:

在周期性的局部热点 数据场景,有大概率可能造成缓存污染。缓存命中率不高 。

具体来说:最近访问的数据,并不一定是周期性访问的数据, 比如把全量的数据做一次迭代,那么LRU会产生较大的缓存污染,因为周期性的局部热点数据,可能会被淘汰。

总之

如上所述,对于偶发性、周期性的数据没有良好的抵抗力,很容易就造成缓存的污染,影响命中率。

相关文章
|
4月前
|
缓存 算法 Java
Caffeine Cache~高性能 Java 本地缓存之王
Caffeine Cache~高性能 Java 本地缓存之王
324 1
|
1月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
1月前
|
缓存 Java Spring
Java本地高性能缓存实践问题之Caffeine中设置刷新机制的问题如何解决
Java本地高性能缓存实践问题之Caffeine中设置刷新机制的问题如何解决
|
1月前
|
存储 缓存 Java
Java本地高性能缓存实践问题之如何定义Caffeine的缓存
Java本地高性能缓存实践问题之如何定义Caffeine的缓存
|
1月前
|
缓存 Java
Java本地高性能缓存实践问题之Caffeine缓存库中基于时间设置驱逐策略的问题如何解决
Java本地高性能缓存实践问题之Caffeine缓存库中基于时间设置驱逐策略的问题如何解决
|
1月前
|
缓存 Java
Java本地高性能缓存实践问题之使用Caffeine的Cache接口来查找一个缓存元素的问题如何解决
Java本地高性能缓存实践问题之使用Caffeine的Cache接口来查找一个缓存元素的问题如何解决
|
2天前
|
存储 消息中间件 缓存
本地缓存Caffeine系列(三)
本地缓存Caffeine系列(三)
|
2天前
|
存储 缓存 NoSQL
本地缓存Caffeine系列(一)
本地缓存Caffeine系列(一)
|
2天前
|
缓存 NoSQL 算法
本地缓存Caffeine系列(四)
本地缓存Caffeine系列(四)
|
2天前
|
缓存 NoSQL 中间件
本地缓存Caffeine系列(二)
本地缓存Caffeine系列(二)