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

缓存利器之Ehcache的更多相关文章

  1. Win下必备利器之Cmder

    诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...

  2. C#编程利器之二:结构与枚举(Structure and enumeration)【转】

    C#编程利器之二:结构与枚举(Structure and enumeration) 在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着 ...

  3. 大数据并行计算利器之MPI/OpenMP

    大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...

  4. Mybatis第八篇【一级缓存、二级缓存、与ehcache整合】

    Mybatis缓存 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. myba ...

  5. Spring Boot Oauth2缓存UserDetails到Ehcache

    在Spring中有一个类CachingUserDetailsService实现了UserDetailsService接口,该类使用静态代理模式为UserDetailsService提供缓存功能.该类源 ...

  6. php调试利器之phpdbg

    信海龙的博客 php调试利器之phpdbg 简介 PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境. PHPDBG的目标是成为一个轻量级.强大.易用的 ...

  7. java-mybaits-00602-查询缓存-mybatis整合ehcache

    ehcache是一个分布式缓存框架.EhCache 是一个纯Java的进程内缓存框架,是一种广泛使用的开源Java分布式缓存,具有快速.精干等特点,是Hibernate中默认的CacheProvide ...

  8. 后台任务利器之Hangfire

    后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4 ...

  9. Android开发利器之ActivityTracker

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracke ...

随机推荐

  1. P3688 [ZJOI2017] 树状数组 【二维线段树】

    题目描述:这里有一个写挂的树状数组: 有两种共\(m\)个操作: 输入\(l,r\),在\([l,r]\)中随机选择一个整数\(x\)执行\(\text{Add}(x)\) 输入\(l,r\),询问执 ...

  2. intelij idea 2018 license server

    http://www.cnblogs.com/jin-zhe/p/9267912.html

  3. slax自启动程序

    Fluxbox 本身提供了自启动程序的功能.~/.fluxbox/startup 文件是一个像启动 Fluxbox 一样自启动应用程序的脚本.# 标记是注释. 一个简单的例子: #!/bin/sh # ...

  4. 如何在openfoam中使用probes?【转载】

    The probes functionObject 可以监测结果和在后处理中提出结果处理结果.基本用法如下: in $FOAM_TUTORIAL/oodles/pitzDaily/ case func ...

  5. Mac下不能成功打开uiautomatorviewer的问题解决

    在终端运行uiautomatorviewer之后出现下面的错误,检查以后发现环境变量也配置好了 Error: Could not create the Java Virtual Machine. Er ...

  6. Factor_Analysis

    Factor_Analysis(因子分析) Factor Analysis 简书:较好理解的解释,其中公式有一定的推导(仅展现关键步骤,细节大多需要自行补充),基本为结论式. 感性层面理解:首先,明确 ...

  7. python: 关于解决'\u'开头的字符串转中文的方法

    爬虫爬到的内容是这样的: 如果直接打印出来是这样的: python3的解决办法:字符串.encode('utf-8').decode('unicode_escape') python2:字符串.dec ...

  8. Thrift: Scalable Cross-Language Services Implementation

    http://thrift.apache.org/static/files/thrift-20070401.pdf

  9. Tosca Connection Validation error:40 - Could not open a connection to SQL Server (不知道怎么解决)

    谁知道下面这个错怎么解决,请给我留言,谢谢. 数据库能正常链接,服务也是 normal running

  10. android: 使用android逆向助手反编译APK

    第一步:下载逆向助手:(链接: https://pan.baidu.com/s/15jtoFDg9LWV80HREeyx5HA 提取码: k527 ) 第二步:将apk文件拷贝到逆向助手的apktoo ...