ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:845.84KB ,
资源ID:6094088      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6094088.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Ehcache是现在最流行的纯Java开源缓存框架.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Ehcache是现在最流行的纯Java开源缓存框架.docx

1、Ehcache是现在最流行的纯Java开源缓存框架Ehcache是现在最流行的纯Java开源缓存框架2014-12-22 13:2837723人阅读评论(0)收藏举报分类:java(405)Ehcache是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大,最初知道它,是从hibernate的缓存开始的。网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的问题,请自行google;对于API,官网上介绍已经非常清楚,请参见官网;但是很少见到特性说明和对实现原理的分析,因此在这篇文章里面,我会详细介绍和分析EhCache的特性,加上一些自己的理解和思考,希望对缓存

2、感兴趣的朋友有所收获。一、特性一览,来自官网,简单翻译一下:1、快速轻量过去几年,诸多测试表明Ehcache是最快的Java缓存之一。Ehcache的线程机制是为大型高并发系统设计的。大量性能测试用例保证Ehcache在不同版本间性能表现得一致性。很多用户都不知道他们正在用Ehcache,因为不需要什么特别的配置。API易于使用,这就很容易部署上线和运行。很小的jar包,Ehcache 2.2.3才668kb。最小的依赖:唯一的依赖就是SLF4J了。2、伸缩性缓存在内存和磁盘存储可以伸缩到数G,Ehcache为大数据存储做过优化。大内存的情况下,所有进程可以支持数百G的吞吐。为高并发和大型多C

3、PU服务器做优化。线程安全和性能总是一对矛盾,Ehcache的线程机制设计采用了Doug Lea的想法来获得较高的性能。单台虚拟机上支持多缓存管理器。通过Terracotta服务器矩阵,可以伸缩到数百个节点。3、灵活性Ehcache 1.2具备对象API接口和可序列化API接口。不能序列化的对象可以使用除磁盘存储外Ehcache的所有功能。除了元素的返回方法以外,API都是统一的。只有这两个方法不一致:getObjectValue和getKeyValue。这就使得缓存对象、序列化对象来获取新的特性这个过程很简单。支持基于Cache和基于Element的过期策略,每个Cache的存活时间都是可以

4、设置和控制的。提供了LRU、LFU和FIFO缓存淘汰算法,Ehcache 1.2引入了最少使用和先进先出缓存淘汰算法,构成了完整的缓存淘汰算法。提供内存和磁盘存储,Ehcache和大多数缓存解决方案一样,提供高性能的内存和磁盘存储。动态、运行时缓存配置,存活时间、空闲时间、内存和磁盘存放缓存的最大数目都是可以在运行时修改的。4、标准支持Ehcache提供了对JSR107 JCACHE API最完整的实现。因为JCACHE在发布以前,Ehcache的实现(如net.sf.jsr107cache)已经发布了。实现JCACHE API有利于到未来其他缓存解决方案的可移植性。Ehcache的维护者Gr

5、eg Luck,正是JSR107的专家委员会委员。5、可扩展性监听器可以插件化。Ehcache 1.2提供了CacheManagerEventListener和CacheEventListener接口,实现可以插件化,并且可以在ehcache.xml里配置。节点发现,冗余器和监听器都可以插件化。分布式缓存,从Ehcache 1.2开始引入,包含了一些权衡的选项。Ehcache的团队相信没有什么是万能的配置。实现者可以使用内建的机制或者完全自己实现,因为有完整的插件开发指南。缓存的可扩展性可以插件化。创建你自己的缓存扩展,它可以持有一个缓存的引用,并且绑定在缓存的生命周期内。缓存加载器可以插件化

6、。创建你自己的缓存加载器,可以使用一些异步方法来加载数据到缓存里面。缓存异常处理器可以插件化。创建一个异常处理器,在异常发生的时候,可以执行某些特定操作。6、应用持久化在VM重启后,持久化到磁盘的存储可以复原数据。Ehcache是第一个引入缓存数据持久化存储的开源Java缓存框架。缓存的数据可以在机器重启后从磁盘上重新获得。根据需要将缓存刷到磁盘。将缓存条目刷到磁盘的操作可以通过cache.flush()方法来执行,这大大方便了Ehcache的使用。7、监听器缓存管理器监听器。允许注册实现了CacheManagerEventListener接口的监听器:notifyCacheAdded()no

7、tifyCacheRemoved()缓存事件监听器。允许注册实现了CacheEventListener接口的监听器,它提供了许多对缓存事件发生后的处理机制:notifyElementRemoved/Put/Updated/Expired8、开启JMXEhcache的JMX功能是默认开启的,你可以监控和管理如下的MBean:CacheManager、Cache、CacheConfiguration、CacheStatistics9、分布式缓存从Ehcache 1.2开始,支持高性能的分布式缓存,兼具灵活性和扩展性。分布式缓存的选项包括:通过Terracotta的缓存集群:设定和使用Terraco

8、tta模式的Ehcache缓存。缓存发现是自动完成的,并且有很多选项可以用来调试缓存行为和性能。使用RMI、JGroups或者JMS来冗余缓存数据:节点可以通过多播或发现者手动配置。状态更新可以通过RMI连接来异步或者同步完成。Custom:一个综合的插件机制,支持发现和复制的能力。可用的缓存复制选项。支持的通过RMI、JGroups或JMS进行的异步或同步的缓存复制。可靠的分发:使用TCP的内建分发机制。节点发现:节点可以手动配置或者使用多播自动发现,并且可以自动添加和移除节点。对于多播阻塞的情况下,手动配置可以很好地控制。分布式缓存可以任意时间加入或者离开集群。缓存可以配置在初始化的时候执

9、行引导程序员。BootstrapCacheLoaderFactory抽象工厂,实现了BootstrapCacheLoader接口(RMI实现)。缓存服务端。Ehcache提供了一个Cache Server,一个war包,为绝大多数web容器或者是独立的服务器提供支持。缓存服务端有两组API:面向资源的RESTful,还有就是SOAP。客户端没有实现语言的限制。RESTful缓存服务器:Ehcached的实现严格遵循RESTful面向资源的架构风格。SOAP缓存服务端:Ehcache RESTFul Web Services API暴露了单例的CacheManager,他能在ehcache.xm

10、l或者IoC容器里面配置。标准服务端包含了内嵌的Glassfish web容器。它被打成了war包,可以任意部署到支持Servlet 2.5的web容器内。Glassfish V2/3、Tomcat 6和Jetty 6都已经经过了测试。10、搜索标准分布式搜索使用了流式查询接口的方式,请参阅文档。11、Java EE和应用缓存为普通缓存场景和模式提供高质量的实现。阻塞缓存:它的机制避免了复制进程并发操作的问题。SelfPopulatingCache在缓存一些开销昂贵操作时显得特别有用,它是一种针对读优化的缓存。它不需要调用者知道缓存元素怎样被返回,也支持在不阻塞读的情况下刷新缓存条目。Cach

11、ingFilter:一个抽象、可扩展的cache filter。SimplePageCachingFilter:用于缓存基于request URI和Query String的页面。它可以根据HTTP request header的值来选择采用或者不采用gzip压缩方式将页面发到浏览器端。你可以用它来缓存整个Servlet页面,无论你采用的是JSP、velocity,或者其他的页面渲染技术。SimplePageFragmentCachingFilter:缓存页面片段,基于request URI和Query String。在JSP中使用jsp:include标签包含。已经使用Orion和Tomca

12、t测试过,兼容Servlet 2.3、Servlet 2.4规范。Cacheable命令:这是一种老的命令行模式,支持异步行为、容错。兼容Hibernate,兼容Google App Engine。基于JTA的事务支持,支持事务资源管理,二阶段提交和回滚,以及本地事务。12、开源协议Apache 2.0 license二、Ehcache的加载模块列表,他们都是独立的库,每个都为Ehcache添加新的功能,可以在此下载: ehcache-core:API,标准缓存引擎,RMI复制和Hibernate支持 ehcache:分布式Ehcache,包括Ehcache的核心和Terracotta的库 e

13、hcache-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 ca

14、che的无锁读 ehcache-debugger:记录RMI分布式调用事件 Ehcache for Ruby:Jruby and Rails支持Ehcache的结构设计概览:三、核心定义:cache manager:缓存管理器,以前是只允许单例的,不过现在也可以多实例了cache:缓存管理器内可以放置若干cache,存放数据的实质,所有cache都实现了Ehcache接口element:单条缓存数据的组成单位system of record(SOR):可以取到真实数据的组件,可以是真正的业务逻辑、外部接口调用、存放真实数据的数据库等等,缓存就是从SOR中读取或者写入到SOR中去的。代码示例:J

15、ava代码 1. CacheManagermanager=CacheManager.newInstance(src/config/ehcache.xml);2. manager.addCache(testCache);3. Cachetest=singletonManager.getCache(testCache);4. test.put(newElement(key1,value1);5. manager.shutdown();当然,也支持这种类似DSL的配置方式,配置都是可以在运行时动态修改的:Java代码 1. CachetestCache=newCache(2. newCacheCon

16、figuration(testCache,maxElements)3. .memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LFU)4. .overflowToDisk(true)5. .eternal(false)6. .timeToLiveSeconds(60)7. .timeToIdleSeconds(30)8. .diskPersistent(false)9. .diskExpiryThreadIntervalSeconds(0);事务的例子:Java代码 1. Ehcachecache=cacheManager.getEhcach

17、e(xaCache);2. transactionManager.begin();3. try4. Elemente=cache.get(key);5. Objectresult=complexService.doStuff(element.getValue();6. cache.put(newElement(key,result);7. complexService.doMoreStuff(result);8. transactionMmit();9. catch(Exceptione)10. transactionManager.rollback();11. 四、一致性模型:说到一致性,数

18、据库的一致性是怎样的?不妨先来回顾一下数据库的几个隔离级别:未提交读(Read Uncommitted):在读数据时不会检查或使用任何锁。因此,在这种隔离级别中可能读取到没有提交的数据。会出现脏读、不可重复读、幻象读。已提交读(Read Committed):只读取提交的数据并等待其他事务释放排他锁。读数据的共享锁在读操作完成后立即释放。已提交读是数据库的默认隔离级别。会出现不可重复读、幻象读。可重复读(Repeatable Read):像已提交读级别那样读数据,但会保持共享锁直到事务结束。会出现幻象读。可序列化(Serializable):工作方式类似于可重复读。但它不仅会锁定受影响的数据,

19、还会锁定这个范围,这就阻止了新数据插入查询所涉及的范围。基于以上,再来对比思考下面的一致性模型:1、强一致性模型:系统中的某个数据被成功更新(事务成功返回)后,后续任何对该数据的读取操作都得到更新后的值。这是传统关系数据库提供的一致性模型,也是关系数据库深受人们喜爱的原因之一。强一致性模型下的性能消耗通常是最大的。2、弱一致性模型:系统中的某个数据被更新后,后续对该数据的读取操作得到的不一定是更新后的值,这种情况下通常有个“不一致性时间窗口”存在:即数据更新完成后在经过这个时间窗口,后续读取操作就能够得到更新后的值。3、最终一致性模型:属于弱一致性的一种,即某个数据被更新后,如果该数据后续没有

20、被再次更新,那么最终所有的读取操作都会返回更新后的值。最终一致性模型包含如下几个必要属性,都比较好理解: 读写一致:某线程A,更新某条数据以后,后续的访问全部都能取得更新后的数据。 会话内一致:它本质上和上面那一条是一致的,某用户更改了数据,只要会话还存在,后续他取得的所有数据都必须是更改后的数据。 单调读一致:如果一个进程可以看到当前的值,那么后续的访问不能返回之前的值。 单调写一致:对同一进程内的写行为必须是保序的,否则,写完毕的结果就是不可预期的了。4、Bulk Load:这种模型是基于批量加载数据到缓存里面的场景而优化的,没有引入锁和常规的淘汰算法这些降低性能的东西,它和最终一致性模型

21、很像,但是有批量、高速写和弱一致性保证的机制。这样几个API也会影响到一致性的结果:1、显式锁(Explicit Locking):如果我们本身就配置为强一致性,那么自然所有的缓存操作都具备事务性质。而如果我们配置成最终一致性时,再在外部使用显式锁API,也可以达到事务的效果。当然这样的锁可以控制得更细粒度,但是依然可能存在竞争和线程阻塞。2、无锁可读取视图(UnlockedReadsView):一个允许脏读的decorator,它只能用在强一致性的配置下,它通过申请一个特殊的写锁来比完全的强一致性配置提升性能。举例如下,xml配置为强一致性模型:Xml代码 1. cachename=myCa

22、che2. maxElementsInMemory=5003. eternal=false4. overflowToDisk=false5. 6. 但是使用UnlockedReadsView:Java代码 1. Cachecache=cacheManager.getEhcache(myCache);2. UnlockedReadsViewunlockedReadsView=newUnlockedReadsView(cache,myUnlockedCache);3、原子方法(Atomic methods):方法执行是原子化的,即CAS操作(Compare and Swap)。CAS最终也实现了强

23、一致性的效果,但不同的是,它是采用乐观锁而不是悲观锁来实现的。在乐观锁机制下,更新的操作可能不成功,因为在这过程中可能会有其他线程对同一条数据进行变更,那么在失败后需要重新执行更新操作。现代的CPU都支持CAS原语了。Java代码 1. cache.putIfAbsent(Elementelement);2. cache.replace(ElementoldOne,ElementnewOne);3. cache.remove(Element);五、缓存拓扑类型:1、独立缓存(Standalone Ehcache):这样的缓存应用节点都是独立的,互相不通信。2、分布式缓存(Distributed

24、 Ehcache):数据存储在Terracotta的服务器阵列(Terracotta Server Array,TSA)中,但是最近使用的数据,可以存储在各个应用节点中。逻辑视角:L1缓存就在各个应用节点上,而L2缓存则放在Cache Server阵列中。组网视角:模型存储视角:L1级缓存是没有持久化存储的。另外,从缓存数据量上看,server端远大于应用节点。3、复制式缓存(Replicated Ehcache):缓存数据时同时存放在多个应用节点的,数据复制和失效的事件以同步或者异步的形式在各个集群节点间传播。上述事件到来时,会阻塞写线程的操作。在这种模式下,只有弱一致性模型。它有如下几种事

25、件传播机制:RMI、JGroups、JMS和Cache Server。RMI模式下,所有节点全部对等:JGroup模式:可以配置单播或者多播,协议栈和配置都非常灵活。Xml代码 1. JMS模式:这种模式的核心就是一个消息队列,每个应用节点都订阅预先定义好的主题,同时,节点有元素更新时,也会发布更新元素到主题中去。JMS规范实现者上,Open MQ和Active MQ这两个,Ehcache的兼容性都已经测试过。Cache Server模式:这种模式下存在主从节点,通信可以通过RESTful的API或者SOAP。无论上面哪个模式,更新事件又可以分为updateViaCopy或updateViaI

26、nvalidate,后者只是发送一个过期消息,效率要高得多。复制式缓存容易出现数据不一致的问题,如果这成为一个问题,可以考虑使用数据同步分发的机制。即便不采用分布式缓存和复制式缓存,依然会出现一些不好的行为,比如:缓存漂移(Cache Drift):每个应用节点只管理自己的缓存,在更新某个节点的时候,不会影响到其他的节点,这样数据之间可能就不同步了。这在web会话数据缓存中情况尤甚。数据库瓶颈(Database Bottlenecks ):对于单实例的应用来说,缓存可以保护数据库的读风暴;但是,在集群的环境下,每一个应用节点都要定期保持数据最新,节点越多,要维持这样的情况对数据库的开销也越大。

27、六、存储方式:1、堆内存储:速度快,但是容量有限。2、堆外(OffHeapStore)存储:被称为BigMemory,只在企业版本的Ehcache中提供,原理是利用nio的DirectByteBuffers实现,比存储到磁盘上快,而且完全不受GC的影响,可以保证响应时间的稳定性;但是direct buffer的在分配上的开销要比heap buffer大,而且要求必须以字节数组方式存储,因此对象必须在存储过程中进行序列化,读取则进行反序列化操作,它的速度大约比堆内存储慢一个数量级。(注:direct buffer不受GC影响,但是direct buffer归属的的JAVA对象是在堆上且能够被GC

28、回收的,一旦它被回收,JVM将释放direct buffer的堆外空间。)3、磁盘存储。七、缓存使用模式:cache-aside:直接操作。先询问cache某条缓存数据是否存在,存在的话直接从cache中返回数据,绕过SOR;如果不存在,从SOR中取得数据,然后再放入cache中。Java代码 1. publicVreadSomeData(Kkey)2. 3. Elementelement;4. if(element=cache.get(key)!=null)5. returnelement.getValue();6. 7. if(value=readDataFromDataStore(key)!=null)8. cache.put(newElement(key,value);9. 10. returnvalue;11. cache-as-sor:结合了read-through、write-through或write-behind操作,通过给SOR增加了一层代理,对外部应用访问来说,它不用区别数据是从缓存中还是从SOR中取得的。read-through。write-through。write-behind(write-back):既将写的过程变为异步的,又进一步延迟写入数据的过程。C

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1