Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。
在一些项目中可能会用到这个缓存框架,这是我们就需要进行spring和ehcache的整合,在整合过程中通常需要在ehcahe.xml中进行如下配置

这里写图片描述

在配置文件中参数”memoryStoreEvictionPolicy”指定了缓存的清空策略,当maxElementsInMemory达到限制时会根据指定的策略进行清空缓存。
缓存的清空策略一共有三种:
LRU(Least Recently Used):最近最少使用
LFU(Leats Frequently Uesd):最不经常使用
FIFO(First in First Out):先进先出
下面将会对这三种算法做详细的说明:

LRU(最近最少使用)
lru:根据数据的历史访问记录进行淘汰数据,它的基本思想是”如果数据最近被访问的次数多,那么在将来被访问的几率也会大一些。”我们只需要在每次调换时,找到最近最久使用的那个页面调出内存。这就是LRU算法的全部内容。
LRU算法的淘汰过程如下:
假设序列:4 3 4 2 3 1 4 2
假设物理块有3个
这里写图片描述
LRU一般采用链表的方式实现,便于快速移动数据的位置,一开始缓存池是空的,往缓存池中插入数据的时候不用担心容量不足的问题,在第四步的时候缓存池已经满了(在实际应用的时候不会让到达缓存的尺寸的,一般70%左右就开始考虑淘汰机制了),在第五步的时候从缓存池访问数据“3”,数据“3”被访问从时间点上来看是最近被访问的,将3移动到链表的顶端。在第六步的时候,数据“1”进入缓存池发现缓存池已满,按照LRU淘汰算法的原则把数据“4”淘汰,将数据“1”插入缓存池中。
LRU算法的缺陷就是仅从时间上来考虑有可能会淘汰仍然有价值的单元。

LFU(最不经常使用)
LFU:根据数据的历史访问频率来淘汰数据,它的核心思想就是“如果数据过去被访问多次,那么未来被访问的频率也更高”。
实现:LFU每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同的计数的数据块按照时间来排序。
LFU算法的淘汰过程如下:
这里写图片描述
图中红色字体为每个数据被访问的次数,被访问的次数多的放在顶部(如果数据被访问的次数相同,则按照时间进行排序,最近被访问的排在上面)。
在第三步的时候3和4被访问的次数都为“1”,当访问次数相同时按照时间进行排序,在第六步的时候,数据“1”进入但是此时缓存池已满(此时数据“2”被访问次数最好)按照LFU算法淘汰原则数据“2”被淘汰。

FIFO(先进先出)
FIFO:根据数据块进入缓存池的顺序进行淘汰,它的基本思想就是“先进入缓存池的数据先被淘汰”,符合队列的特性,数据结构上使用队列(Queue)来实现。
FIFO算法淘汰过程如下:
这里写图片描述
在第四步数据“2”进入后此时缓存池已满,当进行到第五步时3进入并没有淘汰任何数据,因为此时缓存池已经存在数据“3”所以对缓存池中的“3”进行调用,当进行到第六步“1”进入的时候,由于此时的缓存池已满并且缓存池中还不存在数据“1”,所以要进行淘汰,根据“先进先出”的原则淘汰的是数据“4”。

以上就是我对ehcahe清空缓存的3种策略的初步理解,如有不对欢迎指正。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐