初步认识Ehcache清空缓存的3种策略

Posted Java资料站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初步认识Ehcache清空缓存的3种策略相关的知识,希望对你有一定的参考价值。

优质文章,第一时间送达

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个 
初步认识Ehcache清空缓存的3种策略
LRU一般采用链表的方式实现,便于快速移动数据的位置,一开始缓存池是空的,往缓存池中插入数据的时候不用担心容量不足的问题,在第四步的时候缓存池已经满了(在实际应用的时候不会让到达缓存的尺寸的,一般70%左右就开始考虑淘汰机制了),在第五步的时候从缓存池访问数据“3”,数据“3”被访问从时间点上来看是最近被访问的,将3移动到链表的顶端。在第六步的时候,数据“1”进入缓存池发现缓存池已满,按照LRU淘汰算法的原则把数据“4”淘汰,将数据“1”插入缓存池中。 
LRU算法的缺陷就是仅从时间上来考虑有可能会淘汰仍然有价值的单元。

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

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

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



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:

https://blog.csdn.net/weixin_39477597/article/details/78038064






粉丝福利:Java从入门到入土学习路线图

以上是关于初步认识Ehcache清空缓存的3种策略的主要内容,如果未能解决你的问题,请参考以下文章

缓存策略

mybatis_二级缓存深入_使用第三方ehcache配置二级缓存

Ehcache Memcache Redis 初步

Ehcache 实现 Hibernate 二级缓存策略

Hibernatne 缓存中二级缓存简单介绍

EhCache初体验