缓存利器之Ehcache

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点。是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。另外Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现。ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apache License V2.0作为授权方式,被广泛地用于Hibernate,  Spring,Cocoon等其他开源系统。它支持注解方式使用缓存,非常方便。

1.2 Ehcache的特点

(1)快速简单,具有多种缓存策略

(2)缓存数据有两级为内存和磁盘,缓存数据会在虚拟机重启的过程中写入磁盘

(3)可以通过RMI、可插入API等方式进行分布式缓存

(4)具有缓存和缓存管理器的侦听接口

(5)支持多缓存管理器实例,以及一个实例的多个缓存区域。并提供Hibernate的缓存实现

1.3 Ehcache的类层次模型:

Ehcache的类层次模型主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的CacheManager,或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Elemenat。而Element则是我们用于存放要缓存内容的地方。事件处理:可以为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。
可以为Cache添加事件监听,当对Cache增删Element时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。

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添加新的功能,可以在此下载 :

  • ehcache-core:API,标准缓存引擎,RMI复制和Hibernate支持
  • ehcache:分布式Ehcache,包括Ehcache的核心和Terracotta的库
  • ehcache-monitor:企业级监控和管理
  • ehcache-web:为Java Servlet Container提供缓存、gzip压缩支持的filters
  • ehcache-jcache:JSR107 JCACHE的实现
  • ehcache-jgroupsreplication:使用JGroup的复制
  • ehcache-jmsreplication:使用JMS的复制
  • ehcache-openjpa:OpenJPA插件
  • ehcache-server:war内部署或者单独部署的RESTful cache server
  • ehcache-unlockedreadsview:允许Terracotta cache的无锁读
  • ehcache-debugger:记录RMI分布式调用事件
  • Ehcache for Ruby:Jruby and Rails支持

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

猜你喜欢

转载自www.cnblogs.com/w2367033945/p/11080486.html