ehcache java 对象java缓存实现怎么实现

本文由&– 小峰原创,转载请看清文末的转载要求,欢迎参与我们的!
是一个Java实现的开源分布式缓存框架,EhCache 可以有效地减轻数据库的负载,可以让数据保存在不同服务器的内存中,在需要数据的时候可以快速存取。同时EhCache 扩展非常简单,官方提供的Cache配置方式有好几种。你可以通过声明配置、在xml中配置、在程序里配置或者调用构造方法时传入不同的参数。
以下是EhCache 的架构图:
Ehcache有以下特点:
存取速度非常快,性能很不错。
可以应用多种缓存策略。
分级缓存,用户可以指定哪些数据在硬盘中缓存,哪些数据在内存中缓存。
可以通过RMI、可插入API等方式进行分布式缓存。
具有缓存和缓存管理器的侦听接口。
支持多缓存管理器实例,以及一个实例的多个缓存区域。
默认提供Hibernate的缓存实现。
Ehcache的配置示例代码:
&diskStore path=”java.io.tmpdir”/&
&defaultCache
maxElementsInMemory=&#″
eternal=”false”
timeToIdleSeconds=+
timeToLiveSeconds=+
overflowToDisk=”true”
maxElementsOnDisk=&#0″
diskPersistent=”false”
diskExpiryThreadIntervalSeconds=+
memoryStoreEvictionPolicy=”LRU”
&/ehcache&
在同类的Java缓存框架中,Ehcache配置相对简单,也比较容易上手,最大的优势是它支持分布式缓存。
本文链接:
本文作者:&– 小峰
[&原创作品,转载必须在正文中标注并保留原文链接和作者等信息。]
热门栏目订阅EhCache缓存系统在集成环境中的使用详解
来源:码农网&&&时间: 10:43:51&&&阅读数:
[导读] Ehcache缓存系统简介EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。下图是 EhCache 在应用程序中的位置:图 1
EhCache 应用架构图EhCache
Ehcache&缓存系统简介
EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。
下图是 EhCache 在应用程序中的位置:
图 1. EhCache 应用架构图
EhCache 的主要特性有:
多种缓存策略;
缓存数据有两级:内存和磁盘,因此无需担心容量问题;
缓存数据会在虚拟机重启的过程中写入磁盘;
可以通过 RMI、可插入 API 等方式进行分布式缓存;
具有缓存和缓存管理器的侦听接口;
支持多缓存管理器实例,以及一个实例的多个缓存区域;
提供 Hibernate 的缓存实现;
由于 EhCache 是进程中的缓存系统,一旦将应用部署在集群环境中,每一个节点维护各自的缓存数据,当某个节点对缓存数据进行更新,这些更新的数据无法在其它节点中共享,这不仅会降低节点运行的效率,而且会导致数据不同步的情况发生。例如某个网站采用 A、B 两个节点作为集群部署,当 A 节点的缓存更新后,而 B 节点缓存尚未更新就可能出现用户在浏览页面的时候,一会是更新后的数据,一会是尚未更新的数据,尽管我们也可以通过 Session Sticky 技术来将用户锁定在某个节点上,但对于一些交互性比较强或者是非 Web 方式的系统来说,Session Sticky 显然不太适合。所以就需要用到 EhCache 的集群解决方案。
EhCache 从 1.7 版本开始,支持五种集群方案,分别是:
Terracotta
EhCache Server
本文主要介绍其中的三种最为常用集群方式,分别是 RMI、JGroups 以及 EhCache Server 。
RMI 集群模式
RMI 是 Java 的一种远程方法调用技术,是一种点对点的基于 Java 对象的通讯方式。EhCache 从 1.2 版本开始就支持 RMI 方式的缓存集群。在集群环境中 EhCache 所有缓存对象的键和值都必须是可序列化的,也就是必须实现 java.io.Serializable 接口,这点在其它集群方式下也是需要遵守的。
下图是 RMI 集群模式的结构图:
图 2. RMI 集群模式结构图
采用 RMI 集群模式时,集群中的每个节点都是对等关系,并不存在主节点或者从节点的概念,因此节点间必须有一个机制能够互相认识对方,必须知道其它节点的信息,包括主机地址、端口号等。EhCache 提供两种节点的发现方式:手工配置和自动发现。手工配置方式要求在每个节点中配置其它所有节点的连接信息,一旦集群中的节点发生变化时,需要对缓存进行重新配置。
由于 RMI 是 Java 中内置支持的技术,因此使用 RMI 集群模式时,无需引入其它的 Jar 包,EhCache 本身就带有支持 RMI 集群的功能。使用 RMI 集群模式需要在 ehcache.xml 配置文件中定义 cacheManagerPeerProviderFactory 节点。假设集群中有两个节点,分别对应的 RMI 绑定信息是:
192.168.0.11
/oschina_cache
192.168.0.12
/oschina_cache
192.168.0.13
/oschina_cache
那么对应的手工配置信息如下:
&cacheManagerPeerProviderFactory
properties=&hostName=localhost,
port=4567,
socketTimeoutMillis=2000,
peerDiscovery=manual,
rmiUrls=//192.168.0.12:4567/oschina_cache|//192.168.0.13:4567/oschina_cache&
其它节点配置类似,只需把 rmiUrls 中的两个 IP 地址换成另外两个节点对应的 IP 地址即可。
接下来在需要进行缓存数据复制的区域(Region)上配置如下即可:
&cache name=&sampleCache2&
maxElementsInMemory=&10&
eternal=&false&
timeToIdleSeconds=&100&
timeToLiveSeconds=&100&
overflowToDisk=&false&&
&cacheEventListenerFactory
properties=&replicateAsynchronously=true,
replicatePuts=true,
replicateUpdates=true,
replicateUpdatesViaCopy=false,
replicateRemovals=true &/&
具体每个参数代表的意义请参考 EhCache 的手册,此处不再详细说明。
EhCache 的 RMI 集群模式还有另外一种节点发现方式,就是通过多播( multicast )来维护集群中的所有有效节点。这也是最为简单而且灵活的方式,与手工模式不同的是,每个节点上的配置信息都相同,大大方便了节点的部署,避免人为的错漏出现。
在上述三个节点的例子中,配置如下:
&cacheManagerPeerProviderFactory
properties=&peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446, timeToLive=32&
其中需要指定节点发现模式 peerDiscovery 值为 automatic 自动;同时组播地址可以指定 D 类 IP 地址空间,范围从 224.0.1.0 到 238.255.255.255 中的任何一个地址。
JGroups 集群模式
EhCache 从 1.5. 版本开始增加了 JGroups 的分布式集群模式。与 RMI 方式相比较, JGroups 提供了一个非常灵活的协议栈、可靠的单播和多播消息传输,主要的缺点是配置复杂以及一些协议栈对第三方包的依赖。
JGroups 也提供了基于 TCP 的单播 ( Unicast ) 和基于 UDP 的多播 ( Multicast ) ,对应 RMI 的手工配置和自动发现。使用单播方式需要指定其它节点的主机地址和端口,下面是两个节点,并使用了单播方式的配置:
&cacheManagerPeerProviderFactory
properties=&connect=TCP(start_port=7800):
TCPPING(initial_hosts=host1[7800],host2[7800];port_range=10;timeout=3000;
num_initial_members=3;up_thread=down_thread=true):
VERIFY_SUSPECT(timeout=1500;down_thread=up_thread=false):
pbcast.NAKACK(down_thread=up_thread=gc_lag=100;
retransmit_timeout=3000):
pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=
print_local_addr=down_thread=up_thread=true)&
propertySeparator=&::& /&
使用多播方式配置如下:
&cacheManagerPeerProviderFactory
properties=&connect=UDP(mcast_addr=231.12.21.132;mcast_port=45566;):PING:
MERGE2:FD_SOCK:VERIFY_SUSPECT:pbcast.NAKACK:UNICAST:pbcast.STABLE:FRAG:pbcast.GMS&
propertySeparator=&::&
从上面的配置来看,JGroups 的配置要比 RMI 复杂得多,但也提供更多的微调参数,有助于提升缓存数据复制的性能。详细的 JGroups 配置参数的具体意义可参考 JGroups 的配置手册。
JGroups 方式对应缓存节点的配置信息如下:
&cache name=&sampleCache2&
maxElementsInMemory=&10&
eternal=&false&
timeToIdleSeconds=&100&
timeToLiveSeconds=&100&
overflowToDisk=&false&&
&cacheEventListenerFactory
properties=&replicateAsynchronously=true, replicatePuts=true,
replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true& /&
使用组播方式的注意事项
使用 JGroups 需要引入 JGroups 的 Jar 包以及 EhCache 对 JGroups 的封装包 ehcache-jgroupsreplication-xxx.jar 。
在一些启用了 IPv6 的电脑中,经常启动的时候报如下错误信息:
java.lang.RuntimeException: the type of the stack (IPv6) and the user supplied addresses (IPv4) don&t match: /231.12.21.132.
解决的办法是增加 JVM 参数:-Djava.net.preferIPv4Stack=true。如果是 Tomcat 服务器,可在 catalina.bat 或者 catalina.sh 中增加如下环境变量即可:
SET CATALINA_OPTS=-Djava.net.preferIPv4Stack=true
经过实际测试发现,集群方式下的缓存数据都可以在 1 秒钟之内完成到其节点的复制。
EhCache Server
与前面介绍的两种集群方案不同的是, EhCache Server 是一个独立的缓存服务器,其内部使用 EhCache 做为缓存系统,可利用前面提到的两种方式进行内部集群。对外提供编程语言无关的基于 HTTP 的 RESTful 或者是 SOAP 的数据缓存操作接口。
下面是 EhCache Server 提供的对缓存数据进行操作的方法:
OPTIONS /{cache}}
获取某个缓存的可用操作的信息。
HEAD /{cache}/{element}
获取缓存中某个元素的 HTTP 头信息,例如:
curl --head
http://localhost:8080/ehcache/rest/sampleCache2/2
EhCache Server 返回的信息如下:
HTTP/1.1 200 OK
X-Powered-By: Servlet/2.5
Server: GlassFish/v3
Last-Modified: Sun, 27 Jul :49 GMT
Content-Type: text/ charset=iso-8859-1
Content-Length: 157
Date: Sun, 27 Jul :09 GMT
GET /{cache}/{element}
读取缓存中某个数据的值。
PUT /{cache}/{element}
由于这些操作都是基于 HTTP 协议的,因此你可以在任何一种编程语言中使用它,例如 Perl、PHP 和 Ruby 等等。
下图是 EhCache Server 在应用中的架构:
图 3. EhCache Server 应用架构图
EhCache Server 同时也提供强大的安全机制、监控功能。在数据存储方面,最大的 Ehcache 单实例在内存中可以缓存 20GB。最大的磁盘可以缓存 100GB。通过将节点整合在一起,这样缓存数据就可以跨越节点,以此获得更大的容量。将缓存 20GB 的 50 个节点整合在一起就是 1TB 了。
以上我们介绍了三种 EhCache 的集群方案,除了第三种跨编程语言的方案外,EhCache 的集群对应用程序的代码编写都是透明的,程序人员无需考虑缓存数据是如何复制到其它节点上。既保持了代码的轻量级,同时又支持庞大的数据集群。EhCache 可谓是深入人心。
2009 年年中,Terracotta 宣布收购 EhCache 产品。Terracotta 公司的产品 Terracotta 是一个 JVM 级的开源群集框架,提供 HTTP Session 复制、分布式缓存、POJO 群集、跨越集群的 JVM 来实现分布式应用程序协调。最近 EhCache 主要的改进都集中在跟 Terracotta 框架的集成上,这是一个真正意义上的企业级缓存解决方案。
手机扫描下方二维码,关注php100官方微信。
同步官网每日更新,为您带来随时随地的资讯与技术信息。更有不定期的互动抽奖活动,赢取实用贴心的小礼物。
除非特别声明,PHP100新闻均为原创或投稿报道,转载请注明作者及原文链接原文地址:
延伸阅读 More
web_php100&&
haowubai&&
haowubai&&
视频教程 Video
网站服务:
会员问题 :
友情链接 :
网站投稿 :
@php100官方
php100官方微信
Copyright (C) 2007-, All Rights Reserved 版权所有 粤ICP备号-4
粤ICP备号-3&&&&借助Ehcache缓存框架实现对页面的缓存Demo
借助Ehcache缓存框架实现对页面的缓存Demo
本工程用于研究如何借助Ehcache缓存框架实现对页面的缓存
本工程编码方式:UTF-8
本工程开发工具:MyEclipse
1、ehcache.xml和ehcache.xsd两个文件可以在下在下载下来的名为“ehcache-core-x.x.x-distribution.tar.gz”压缩文件中找到
2、由于要实现Ehcache缓存页面,所以必须要添加“ehcache-web-2.0.4.jar” jar包,该jar包主要用于辅助Ehcache实现页面缓存
本web工程的发布不要使用Tomcat7,否则会出现如下异常:
9:53:50 org.apache.catalina.loader.WebappClassLoader loadClass
信息: Illegal access: this web application instance has been stopped already.
Could not load net.sf.ehcache.store.disk.DiskStore$KeySet.
The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
at net.sf.ehcache.store.disk.DiskStore.keySet(DiskStore.java:560)
at net.sf.ehcache.store.disk.DiskStorageFactory$DiskExpiryTask.run(DiskStorageFactory.java:838)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
相关jar包下载地址:
Ehcache 对象、数据缓存:http://ehcache.org/downloads/destination?name=ehcache-core-2.5.2-distribution.tar.gz&bucket=tcdistributions&file=ehcache-core-2.5.2-distribution.tar.gz
Web页面缓存:http://ehcache.org/downloads/destination?name=ehcache-web-2.0.4-distribution.tar.gz&bucket=tcdistributions&file=ehcache-web-2.0.4-distribution.tar.gz
若举报审核通过,可奖励20下载分
被举报人:
wangshuxuncom
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
免积分&&极速下载60元/年(1200次)
您可能还需要
开发技术下载排行您所在的位置: &
Spring中集成Ehcache使用页面、对象缓存
Spring中集成Ehcache使用页面、对象缓存
Ehcache在很多项目中都出现过,用法也比较简单。一般的加些配置就可以了,而且Ehcache可以对页面、对象、数据进行缓存,同时支持集群/分布式缓存。如果整合Spring、Hibernate也非常的简单,Spring对Ehcache的支持也非常好。
在很多项目中都出现过,用法也比较简单。一般的加些配置就可以了,而且Ehcache可以对页面、对象、数据进行缓存,同时支持集群/分布式缓存。如果整合Spring、Hibernate也非常的简单,Spring对Ehcache的支持也非常好。EHCache支持内存和磁盘的缓存,支持LRU、LFU和FIFO多种淘汰算法,支持分布式的Cache,可以作为Hibernate的缓存插件。同时它也能提供基于Filter的Cache,该Filter可以缓存响应的内容并采用Gzip压缩提高响应速度。
Email:hoojo_@
一、准备工作
如果你的系统中已经成功加入Spring、Hibernate;那么你就可以进入下面Ehcache的准备工作。
1、 下载jar包
Ehcache 对象、数据缓存:
Web页面缓存:
2、 需要添加如下jar包到lib目录下
&ehcache-core-2.5.2.jar
ehcache-web-2.0.4.jar 主要针对页面缓存
3、 当前工程的src目录中加入配置文件
&ehcache.xml
ehcache.xsd
这些配置文件在ehcache-core这个jar包中可以找到
二、Ehcache基本用法
CacheManager&cacheManager&=&CacheManager.create();&&cacheManager&=&CacheManager.getInstance();&&cacheManager&=&CacheManager.create(&/config/ehcache.xml&);&&cacheManager&=&CacheManager.create(&http://localhost:8080/test/ehcache.xml&);&cacheManager&=&CacheManager.newInstance(&/config/ehcache.xml&);&&&&&Cache&sample&=&cacheManager.getCache(&sample&);&&BlockingCache&cache&=&new&BlockingCache(cacheManager.getEhcache(&SimplePageCachingFilter&));&&Element&element&=&new&Element(&key&,&&val&);&sample.put(element);&&Element&result&=&sample.get(&key&);&&sample.remove(&key&);&sample.removeAll();&&&&for&(String&cacheName&:&cacheManager.getCacheNames())&{&&&&&System.out.println(cacheName);&}&&for&(Object&key&:&cache.getKeys())&{&&&&&System.out.println(key);&}&&&&cache.getSize();&&cache.getMemoryStoreSize();&&cache.getStatistics().getCacheHits();&&cache.getStatistics().getCacheMisses();&
三、页面缓存
页面缓存主要用Filter过滤器对请求的url进行过滤,如果该url在缓存中出现。那么页面数据就从缓存对象中获取,并以gzip压缩后返回。其速度是没有压缩缓存时速度的3-5倍,效率相当之高!其中页面缓存的过滤器有CachingFilter,一般要扩展filter或是自定义Filter都继承该CachingFilter。
CachingFilter功能可以对HTTP响应的内容进行缓存。这种方式缓存数据的粒度比较粗,例如缓存整张页面。它的优点是使用简单、效率高,缺点是不够灵活,可重用程度不高。
EHCache使用SimplePageCachingFilter类实现Filter缓存。该类继承自CachingFilter,有默认产生cache key的calculateKey()方法,该方法使用HTTP请求的URI和查询条件来组成key。也可以自己实现一个Filter,同样继承CachingFilter类,然后覆写calculateKey()方法,生成自定义的key。
CachingFilter输出的数据会根据浏览器发送的Accept-Encoding头信息进行Gzip压缩。
在使用Gzip压缩时,需注意两个问题:
1. Filter在进行Gzip压缩时,采用系统默认编码,对于使用GBK编码的中文网页来说,需要将操作系统的语言设置为:zh_CN.GBK,否则会出现乱码的问题。
2. 默认情况下CachingFilter会根据浏览器发送的请求头部所包含的Accept-Encoding参数值来判断是否进行Gzip压缩。虽然IE6/7浏览器是支持Gzip压缩的,但是在发送请求的时候却不带该参数。为了对IE6/7也能进行Gzip压缩,可以通过继承CachingFilter,实现自己的Filter,然后在具体的实现中覆写方法acceptsGzipEncoding。
具体实现参考:
protected&boolean&acceptsGzipEncoding(HttpServletRequest&request)&{&&boolean&ie6&=&headerContains(request,&&User-Agent&,&&MSIE&6.0&);&&boolean&ie7&=&headerContains(request,&&User-Agent&,&&MSIE&7.0&);&&return&acceptsEncoding(request,&&gzip&)&||&ie6&||&ie7;&&}&
在ehcache.xml中加入如下配置
&?xml&version=&1.0&&encoding=&gbk&?&&&ehcache&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&&xsi:noNamespaceSchemaLocation=&ehcache.xsd&&&&&&&&diskStore&path=&java.io.tmpdir&/&&&&&&&&defaultCache&maxElementsInMemory=&10000&&eternal=&false&&timeToIdleSeconds=&30&&timeToLiveSeconds=&30&&overflowToDisk=&false&/&&&&&&&!--&&&&&&&&&&配置自定义缓存&&&&&&&&&maxElementsInMemory:缓存中允许创建的最大对象数&&&&&&&&&eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。&&&&&&&&&timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,&&&&&&&&&&&&&&&&&&&&&两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,&&&&&&&&&&&&&&&&&&&&&如果该值是&0&就意味着元素可以停顿无穷长的时间。&&&&&&&&&timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,&&&&&&&&&&&&&&&&&&&&&这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。&&&&&&&&&overflowToDisk:内存不足时,是否启用磁盘缓存。&&&&&&&&&memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。&&&&&--&&&&&&&cache&name=&SimplePageCachingFilter&&&&&&&&&&&maxElementsInMemory=&10000&&&&&&&&&&&eternal=&false&&&&&&&&&&overflowToDisk=&false&&&&&&&&&&&timeToIdleSeconds=&900&&&&&&&&&&&timeToLiveSeconds=&1800&&&&&&&&&&memoryStoreEvictionPolicy=&LFU&&/&&&&/ehcache&&
具体代码:
package&com.hoo.ehcache.&&import&java.util.E&import&javax.servlet.FilterC&import&javax.servlet.http.HttpServletR&import&javax.servlet.http.HttpServletR&import&net.sf.ehcache.CacheE&import&net.sf.ehcache.constructs.blocking.LockTimeoutE&import&net.sf.ehcache.constructs.web.AlreadyCommittedE&import&net.sf.ehcache.constructs.web.AlreadyGzippedE&import&net.sf.ehcache.constructs.web.filter.FilterNonReentrantE&import&net.sf.ehcache.constructs.web.filter.SimplePageCachingF&import&mons.lang.StringU&import&org.apache.log4j.L&&&&&&&&&&&&&public&class&PageEhCacheFilter&extends&SimplePageCachingFilter&{&&&&&&private&final&static&Logger&log&=&Logger.getLogger(PageEhCacheFilter.class);&&&&&&private&final&static&String&FILTER_URL_PATTERNS&=&&patterns&;&&&&&private&static&String[]&cacheURLs;&&&&&&private&void&init()&throws&CacheException&{&&&&&&&&&String&patterns&=&filterConfig.getInitParameter(FILTER_URL_PATTERNS);&&&&&&&&&cacheURLs&=&StringUtils.split(patterns,&&,&);&&&&&}&&&&&&@Override&&&&&protected&void&doFilter(final&HttpServletRequest&request,&&&&&&&&&&&&&final&HttpServletResponse&response,&final&FilterChain&chain)&&&&&&&&&&&&&throws&AlreadyGzippedException,&AlreadyCommittedException,&&&&&&&&&&&&&FilterNonReentrantException,&LockTimeoutException,&Exception&{&&&&&&&&&if&(cacheURLs&==&null)&{&&&&&&&&&&&&&init();&&&&&&&&&}&&&&&&&&&&String&url&=&request.getRequestURI();&&&&&&&&&boolean&flag&=&false;&&&&&&&&&if&(cacheURLs&!=&null&&&&cacheURLs.length&&&0)&{&&&&&&&&&&&&&for&(String&cacheURL&:&cacheURLs)&{&&&&&&&&&&&&&&&&&if&(url.contains(cacheURL.trim()))&{&&&&&&&&&&&&&&&&&&&&&flag&=&true;&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&&&&&&&&&&if&(flag)&{&&&&&&&&&&&&&String&query&=&request.getQueryString();&&&&&&&&&&&&&if&(query&!=&null)&{&&&&&&&&&&&&&&&&&query&=&&?&&+&&&&&&&&&&&&&&}&&&&&&&&&&&&&(&当前请求被缓存:&&+&url&+&query);&&&&&&&&&&&&&super.doFilter(request,&response,&chain);&&&&&&&&&}&else&{&&&&&&&&&&&&&chain.doFilter(request,&response);&&&&&&&&&}&&&&&}&&&&&&@SuppressWarnings(&unchecked&)&&&&&private&boolean&headerContains(final&HttpServletRequest&request,&final&String&header,&final&String&value)&{&&&&&&&&&logRequestHeaders(request);&&&&&&&&&final&Enumeration&accepted&=&request.getHeaders(header);&&&&&&&&&while&(accepted.hasMoreElements())&{&&&&&&&&&&&&&final&String&headerValue&=&(String)&accepted.nextElement();&&&&&&&&&&&&&if&(headerValue.indexOf(value)&!=&-1)&{&&&&&&&&&&&&&&&&&return&true;&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&return&false;&&&&&}&&&&&&&&&&&&&&&&@Override&&&&&protected&boolean&acceptsGzipEncoding(HttpServletRequest&request)&{&&&&&&&&&boolean&ie6&=&headerContains(request,&&User-Agent&,&&MSIE&6.0&);&&&&&&&&&boolean&ie7&=&headerContains(request,&&User-Agent&,&&MSIE&7.0&);&&&&&&&&&return&acceptsEncoding(request,&&gzip&)&||&ie6&||&ie7;&&&&&}&}&这里的PageEhCacheFilter继承了SimplePageCachingFilter,一般情况下SimplePageCachingFilter就够用了,这里是为了满足当前系统需求才做了覆盖操作。使用SimplePageCachingFilter需要在web.xml中配置cacheName,cacheName默认是SimplePageCachingFilter,对应ehcache.xml中的cache配置。&&在web.xml中加入如下配置&&&!--&缓存、gzip压缩核心过滤器&--&&&filter&&&&&&&filter-name&PageEhCacheFilter&/filter-name&&&&&&&filter-class&com.hoo.ehcache.filter.PageEhCacheFilter&/filter-class&&&&&&&init-param&&&&&&&&&&&param-name&patterns&/param-name&&&&&&&&&&&!--&配置你需要缓存的url&--&&&&&&&&&&&param-value&/cache.jsp,&product.action,&market.action&&/param-value&&&&&&&/init-param&&&/filter&&&filter-mapping&&&&&&&filter-name&PageEhCacheFilter&/filter-name&&&&&&&url-pattern&*.action&/url-pattern&&&/filter-mapping&&&filter-mapping&&&&&&&filter-name&PageEhCacheFilter&/filter-name&&&&&&&url-pattern&*.jsp&/url-pattern&&&/filter-mapping&&当第一次请求这些页面后,这些页面就会被添加到缓存中,以后请求这些页面将会从缓存中获取。你可以在cache.jsp页面中用小脚本来测试该页面是否被缓存。&%=new&Date()%&如果时间是变动的,则表示该页面没有被缓存或是缓存已经过期,否则则是在缓存状态了。&&四、对象缓存&&对象缓存就是将查询的数据,添加到缓存中,下次再次查询的时候直接从缓存中获取,而不去数据库中查询。&&对象缓存一般是针对方法、类而来的,结合Spring的Aop对象、方法缓存就很简单。这里需要用到切面编程,用到了Spring的MethodInterceptor或是用@Aspect。&&代码如下:&&package&mon.&&import&java.io.S&import&net.sf.ehcache.C&import&net.sf.ehcache.E&import&org.aopalliance.intercept.MethodI&import&org.aopalliance.intercept.MethodI&import&org.apache.log4j.L&import&org.springframework.beans.factory.InitializingB&&&&&&&&&&&&&public&class&MethodCacheInterceptor&implements&MethodInterceptor,&InitializingBean&{&&&&&&private&static&final&Logger&log&=&Logger.getLogger(MethodCacheInterceptor.class);&&&&&&private&Cache&&&&&&&public&void&setCache(Cache&cache)&{&&&&&&&&&this.cache&=&&&&&&}&&&&&&public&void&afterPropertiesSet()&throws&Exception&{&&&&&&&&&(cache&+&&&A&cache&is&required.&Use&setCache(Cache)&to&provide&one.&);&&&&&}&&&&&&public&Object&invoke(MethodInvocation&invocation)&throws&Throwable&{&&&&&&&&&String&targetName&=&invocation.getThis().getClass().getName();&&&&&&&&&String&methodName&=&invocation.getMethod().getName();&&&&&&&&&Object[]&arguments&=&invocation.getArguments();&&&&&&&&&Object&&&&&&&&&&&String&cacheKey&=&getCacheKey(targetName,&methodName,&arguments);&&&&&&&&&Element&element&=&null;&&&&&&&&&synchronized&(this)&{&&&&&&&&&&&&&element&=&cache.get(cacheKey);&&&&&&&&&&&&&if&(element&==&null)&{&&&&&&&&&&&&&&&&&(cacheKey&+&&加入到缓存:&&&+&cache.getName());&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&result&=&invocation.proceed();&&&&&&&&&&&&&&&&&element&=&new&Element(cacheKey,&(Serializable)&result);&&&&&&&&&&&&&&&&&cache.put(element);&&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&(cacheKey&+&&使用缓存:&&&+&cache.getName());&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&return&element.getValue();&&&&&}&&&&&&&&&&&&&&&&&&&private&String&getCacheKey(String&targetName,&String&methodName,&Object[]&arguments)&{&&&&&&&&&StringBuffer&sb&=&new&StringBuffer();&&&&&&&&&sb.append(targetName).append(&.&).append(methodName);&&&&&&&&&if&((arguments&!=&null)&&&&(arguments.length&!=&0))&{&&&&&&&&&&&&&for&(int&i&=&0;&i&&&arguments.&i++)&{&&&&&&&&&&&&&&&&&sb.append(&.&).append(arguments[i]);&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&return&sb.toString();&&&&&}&}&
这里的方法拦截器主要是对你要拦截的类的方法进行拦截,然后判断该方法的类路径+方法名称+参数值组合的cache key在缓存cache中是否存在。如果存在就从缓存中取出该对象,转换成我们要的返回类型。没有的话就把该方法返回的对象添加到缓存中即可。值得主意的是当前方法的参数和返回值的对象类型需要序列化。
我们需要在src目录下添加applicationContext.xml完成对MethodCacheInterceptor拦截器的配置,该配置主意是注入我们的cache对象,哪个cache来管理对象缓存,然后哪些类、方法参与该拦截器的扫描。
添加配置如下:
&context:component-scan&base-package=&mon.interceptor&/&&&&&!--&配置eh缓存管理器&--&&&bean&id=&cacheManager&&class=&org.springframework.cache.ehcache.EhCacheManagerFactoryBean&/&&&&!--&配置一个简单的缓存工厂bean对象&--&&&bean&id=&simpleCache&&class=&org.springframework.cache.ehcache.EhCacheFactoryBean&&&&&&&&property&name=&cacheManager&&ref=&cacheManager&&/&&&&&&&!--&使用缓存&关联ehcache.xml中的缓存配置&--&&&&&&&property&name=&cacheName&&value=&mobileCache&&/&&&/bean&&&&!--&配置一个缓存拦截器对象,处理具体的缓存业务&--&&&bean&id=&methodCacheInterceptor&&class=&com.&mon.interceptor.MethodCacheInterceptor&&&&&&&&property&name=&cache&&ref=&simpleCache&/&&&/bean&&&&!--&参与缓存的切入点对象&(切入点对象,确定何时何地调用拦截器)&--&&&bean&id=&methodCachePointCut&&class=&org.springframework.aop.support.RegexpMethodPointcutAdvisor&&&&&&&&!--&配置缓存aop切面&--&&&&&&&property&name=&advice&&ref=&methodCacheInterceptor&&/&&&&&&&!--&配置哪些方法参与缓存策略&--&&&&&&&!--&&&&&&&&&&&.表示符合任何单一字元&&&&&&&&&&&&&&&&&&&&&&&&&&&###&&+表示符合前一个字元一次或多次&&&&&&&&&&&&&&&&&&&&&&&&&&&###&&*表示符合前一个字元零次或多次&&&&&&&&&&&&&&&&&&&&&&&&&&&###&&\Escape任何Regular&expression使用到的符号&&&&&&&&&&&&&&&&&&&&&&&--&&&&&&&&&&&&&&&&&&&&&&&&!--&.*表示前面的前缀(包括包名)&表示print方法--&&&&&&&property&name=&patterns&&&&&&&&&&&&list&&&&&&&&&&&&&&&value&com.hoo.rest.*RestService*\.*get.*&/value&&&&&&&&&&&&&&&value&com.hoo.rest.*RestService*\.*search.*&/value&&&&&&&&&&&/list&&&&&&&/property&&&/bean&&在ehcache.xml中添加如下cache配置&&&cache&name=&mobileCache&&&&&&&&&&maxElementsInMemory=&10000&&&&&&&&&&eternal=&false&&&&&&&&&&overflowToDisk=&true&&&&&&&&&&timeToIdleSeconds=&1800&&&&&&&&&&timeToLiveSeconds=&3600&&&&&&&&&&memoryStoreEvictionPolicy=&LFU&&/&&
原文链接:/hoojo/archive//2587556.html【编辑推荐】【责任编辑: TEL:(010)】
关于的更多文章
很显然,Oracle已正在开发Java 9。Java 9主要的增强内容之前已经
所以姑娘,让我们做一枚花见花开的程序媛。
讲师: 65人学习过讲师: 9人学习过讲师: 11人学习过
离年末越来越近了,不知道各位有没有倦怠的感觉?本周
怎样尽可能的缩短浏览器上页面渲染的时间?我们可以从
这周的头版头条是“双十一”。凌晨12点守在电脑前抢东
以Linux为代表的自由软件及其稳定性,逐渐在全世界崭露头角且备受重视。由于可以支持多种网络环境,因此在采用Linux系统之前,必
51CTO旗下网站}

我要回帖

更多关于 java 清除ehcache缓存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信