EhCache 是一个纯Java的进程内缓存框架,具备快速、精干等特色。是一种普遍使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。另外Spring 提供了对缓存功能的抽象:即容许绑定不一样的缓存解决方案(如Ehcache),但自己不直接提供缓存功能的实现。ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache做为开放源代码项目,采用限制比较宽松的Apache License V2.0做为受权方式,被普遍地用于Hibernate, Spring,Cocoon等其余开源系统。它支持注解方式使用缓存,很是方便。web
1.2 Ehcache的特色编程
(1)快速简单,具备多种缓存策略缓存
(2)缓存数据有两级为内存和磁盘,缓存数据会在虚拟机重启的过程当中写入磁盘安全
(3)能够经过RMI、可插入API等方式进行分布式缓存ruby
(4)具备缓存和缓存管理器的侦听接口app
(5)支持多缓存管理器实例,以及一个实例的多个缓存区域。并提供Hibernate的缓存实现框架
1.3 Ehcache的类层次模型:jvm
Ehcache的类层次模型主要为三层,最上层的是CacheManager,他是操做Ehcache的入口。咱们能够经过CacheManager.getInstance()得到一个单个的CacheManager,或者经过CacheManager的构造函数建立一个新的CacheManager。每一个CacheManager都管理着多个Cache。而每一个Cache都以一种类Hash的方式,关联着多个Elemenat。而Element则是咱们用于存放要缓存内容的地方。事件处理:能够为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会获得通知。要配置事件处理,须要经过ehcache的配置文件来完成。
能够为Cache添加事件监听,当对Cache增删Element时,事件处理器将会获得通知。要配置事件处理,须要经过ehcache的配置文件来完成。socket
1.4 ehcache的刷新策略
ehcache的刷新策略是当缓存在放入的时候记录一个放入时间,它是用Lazy Evict的方式,在取的时候同设置的TTL比较分布式
1.5 ehcache缓存的3种清空策略:
1 FIFO,先进先出
2 LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
3 LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又须要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
1.6 ehcache参数配置:
maxInMemory - 设定内存中建立对象的最大值。
eternal - 设置元素(译注:内存中对象)是否永久驻留。若是是,将忽略超时限制且元素永不消亡。
timeToIdleSeconds - 设置某个元素消亡前的停顿时间。也就是在一个元素消亡以前,两次访问时间的最大时间间隔值。这只能在元素不是永久驻留时有效(译注:若是对象永恒不灭,则设置该属性也无用)。
若是该值是 0 就意味着元素能够停顿无穷长的时间。
timeToLiveSeconds - 为元素设置消亡前的生存时间。也就是一个元素从构建到消亡的最大时间间隔值。这只能在元素不是永久驻留时有效。
overflowToDisk - 设置当内存中缓存达到maxInMemory 限制时元素是否可写到磁盘上。
1.7 Ehcache结构图以下:
1.8 Ehcache详细结构图以下:
1.9 Ehcache的加载模块列表,他们都是独立的库,每一个都为Ehcache添加新的功能,能够在此下载 :
2.0 Ehcache配置:
ehcache 的配置能够经过在 XML文件中声明,或者经过构造函数中指定参数进行程序控制。
两种方法都能很好的支持。不过将缓存的配置和实际代码分离开来更好一些,这有如下几个好处:
便于在一个地方保存全部的配置信息
缓存使用内存或磁盘空间须要仔细调整和规划,你能够在一个配置文件中获取全部信息。固然你也能够都在代码中搞定,但检查起来就没那么方便。
便于在部署时修改缓存的配置
配置错误便于在启动时被发现,以避免在运行时才暴露出错误
若是存在一个缺省配置,那么它老是会被装载并生效
虽然缺省配置不是必需的,但若是没有加载缺省配置,以编程方式建立命名cance(created by name) 就会产生错误。
动态修改缓存配置
缓存服务启动以后,其配置通常不能再改变。但从 ehcache2.0以后,特定的缓存配置参数能够在运行时动态修改。在当前版本的ehcache,中包含如下几个参数。
timeToLive
一个被缓存的对象(Element)保存在缓存中的最大秒数,不管其是否被使用。超过这个时间限制,该对象将没法从缓存中获取。默认值是0,表示没有限制。
timeToIdle
一个被缓存的对象(Element)保存在缓存中未被访问的最大秒数。超过这个时间限制,该对象将没法从缓存中获取。默认值是0,表示没有限制。
本地缓存参数 maxEntriesLocalHeap, maxBytesLocalHeap, maxBytesLocalOffHeap, maxEntriesLocalDisk, maxBytesLocalDisk.
memory-store eviction policy (内存驱逐策略)
CacheEventListeners 能够动态增或删除
注意Cache 的 "eternal" (永恒)属性,若是设置为true,重置 "timeToLive" 和 timeToIdle" 就都没用了,任何对象都不会过时。
下面的例子演示如何动态修改使用中的缓存。
Cache cache = manager.getCache("sampleCache");
CacheConfiguration config = cache.getCacheConfiguration();
config.setTimeToIdleSeconds(60);
config.setTimeToLiveSeconds(120);
config.setmaxEntriesLocalHeap(10000);
config.setmaxEntriesLocalDisk(1000000);
缓存参数也能够被冻结,防止修改:
Cache cache = manager.getCache("sampleCache");
cache.disableDynamicFeatures();
在 ehcache.xml中,将<ehcache>的dynamicConfig 属性设置为"false", 能够禁止动态修改缓存参数
动态修改分布式缓存配置
和独立缓存同样,操纵分布式缓存的配置也须要经过cache.getCacheConfiguration()方法得到 CacheConfiguration 对象,经过它的一系列 set 方法进行修改。
下表提供了如何动态修改一个Terracotta 集群的公共配置选项的一些信息。表头的"Scope"字段表示配置的变动可以在哪里生效,能够是如下几个值。
Client – The Terracotta client where the CacheManager runs.
TSA – The Terracotta Server Array for the cluster.
BOTH – Both the client and the TSA.
注意 "Both" 是分布式含义,也就是说对全部客户端都会生效
2.1 Ehcache 和 Redis 比较以下
Ehcache | Redis | |
存取速度 | Ehcache直接在jvm虚拟机中缓存,速度快,效率高 | Redis是经过socket访问到缓存服务,效率比ecache低 |
集群和分布式 | Ehcache有缓存共享方案,不过是经过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享能够,可是涉及到缓存恢复,大数据缓存,则不合适。 | Redis有成熟的分布式解决方案。适合大规模分布式集群部署。 |
操做复杂度 | Ehcache提供的接口很是简单明了,从Ehcache的搭建到运用运行仅仅须要的是你宝贵的几分钟。其实不少开发者都不知道本身用在用Ehcache,Ehcache被普遍的运用于其余的开源项目。好比:Hibernate | 至少须要安装服务端和客户端才能使用。操做略比Ehcache复杂一些。 |
2019-06-2500:13:06