细谈Ehcache页面缓存的使用

/**

*作者:张荣华

*日期:2007-9-30

**/

关于缓存的话题,在坛子里已经有很多讨论,简单的来说,如果一个应用中80%的时间内都在访问20%的数据,那么,这时候就应该使用缓存了。这个和长尾理论正好相悖,其实也不是相悖,只是不同的理论使用的场景不同。在80/20原则生效的地方,我们都应该考虑是否可以使用缓存。但即使是这样,缓存也有不同的用法,举个例子,一个网站的首页估计是被访问的次数最多的,我们可以考虑给首页做一个页面缓存,而如果在某个页面上,比如说javaeye的java版区只有前几个页面是访问最频繁的,(假设javaeye是使用hibernate,当然这只是假设,我们都知道javaeye是使用ror开发的)那么我们就可以考虑给java版区的record做二级缓存了,因为二级缓存中是按照对象的id来保存的,所以应该来说这前面几页使用的对象会一直存在于缓存之中(如何使用hibernate的二级缓存坛子上也有介绍)。由此可见不同的页面的缓存策略有可能有天壤之别。

本文的目的就是上面所讲的两种情况之一,页面缓存。毫无疑问,几乎所有的网站的首页都是访问率最高的,而首页上的数据来源又是非常广泛的,大多数来自不同的对象,而且有可能来自不同的db,所以给首页做缓存是一个不错的主意,那么主页的缓存策略是什么样子的呢,我认为应该是某个固定时间之内不变的,比如说2分钟更新一次。那么这个缓存应该做在什么地方呢,让我们来看一下,假设您的应用的结构是page-filter-action-service-dao-db,这个过程中的-的地方都是可以做缓存的地方,根据页面缓存的特征,应该把页面缓存做到尽量靠近客户的地方,就是在page和filter之间,这样的优点就是第一个用户请求之后,页面被缓存,第二个用户再来请求的时候,走到filter这个请求就结束了,无需再走后面的action-service-dao-db。带来的好处是服务器压力的减低和客户段页面响应速度的加快。

那么我们来看一下如何使用ehcache做到这一点。

在使用ehcache的页面缓存之前,我们必须要了解ehcache的几个概念,

1 timeToIdleSeconds,多长时间不访问该缓存,那么ehcache就会清除该缓存。

2 timeToLiveSeconds,缓存的存活时间,从开始创建的时间算起。

看到这里,我们知道,首页的页面缓存的存活时间,我们定的是2分钟,那么也就是说我们的timeToLiveSeconds应该设置为120,同时我们的timeToIdleSeconds最好也设置为2分钟,或者小于2分钟。我们来看一下下面这个配置,这个配置片段应该放到ehcache.xml中:

<cache name="SimplePageCachingFilter"

maxElementsInMemory="10"

maxElementsOnDisk="10"

eternal="false"

overflowToDisk="true"

diskSpoolBufferSizeMB="20"

timeToIdleSeconds="10"

timeToLiveSeconds="10"

memoryStoreEvictionPolicy="LFU"

/>

SimplePageCachingFilter是缓存的名字,maxElementsInMemory表示内存中SimplePageCachingFilter缓存中元素的最大数量为10,maxElementsOnDisk是指持久化该缓存的元素到硬盘上的最大数量也为10(),eternal=false意味着该缓存会死亡。overflowToDisk=true意思是表示当缓存中元素的数量超过限制时,就把这些元素持久化到硬盘,如果overflowToDisk是false,那么maxElementsOnDisk的设置就没有什么意义了。memoryStoreEvictionPolicy=LFU是指按照缓存的hit值来清除,也就是说缓存满了之后,新的对象需要缓存时,将会将缓存中hit值最小的对象清除出缓存,给新的对象腾出地方来了(文章最后有ehcache中自带的3种缓存清空策略的介绍)。

接着我们来看一下SimplePageCachingFilter的配置,

<filter>

<filter-name>indexCacheFilterfilter-name>

<filter-class>

net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter

filter-class>

filter>

<filter-mapping>

<filter-name>indexCacheFilterfilter-name>

<url-pattern>*index.actionurl-pattern>

filter-mapping>

就只需要这么多步骤,我们就可以给某个页面做一个缓存的,把上面这段配置放到你的web.xml中,那么当你打开首页的时候,你会发现,2分钟才会有一堆sql语句出现在控制台上。当然你也可以调成5分钟,总之一切都在控制中。

好了,缓存整个页面看上去是非常的简单,甚至都不需要写一行代码,只需要几行配置就行了,够简单吧,虽然看上去简单,但是事实上内部实现却不简单哦,有兴趣的话,大家可以看看SimplePageCachingFilter继承体系的源代码。

上面的配置针对的情况是缓存首页的全部,如果你只想缓存首页的部分内容时,你需要使用SimplePageFragmentCachingFilter这个filter。我们看一下如下片断:

<filter>

<filter-name>indexCacheFilterfilter-name>

<filter-class>

net.sf.ehcache.constructs.web.filter.SimplePageFragmentCachingFilter

filter-class>

filter>

<filter-mapping>

<filter-name>indexCacheFilterfilter-name>

<url-pattern>*/index_right.jspurl-pattern>

filter-mapping>

这个jsp需要被jsp:include到其他页面,这样就做到的局部页面的缓存。这一点貌似没有oscache的tag好用。

事实上在cachefilter中还有一个特性,就是gzip,也就是说缓存中的元素是被压缩过的,如果客户浏览器支持压缩的话,filter会直接返回压缩过的流,这样节省了带宽,把解压的工作交给了客户浏览器,如果客户的浏览器不支持gzip,那么filter会把缓存的元素拿出来解压后再返回给客户浏览器(大多数爬虫是不支持gzip的,所以filter也会解压后再返回流),这样做的优点是节省带宽,缺点就是增加了客户浏览器的负担(但是我觉得对当代的计算机而言,这个负担微乎其微)。

好了,如果你的页面正好也需要用到页面缓存,不防可以考虑一下ehcache,因为它实在是非常简单,而且易用。

总结:ehcache是一个非常轻量级的缓存实现,而且从1.2之后就支持了集群,目前的最新版本是1.3,而且是hibernate默认的缓存provider。虽然本文是介绍的是ehcache对页面缓存的支持,但是ehcache的功能远不止如此,当然要使用好缓存,对JEE中缓存的原理,使用范围,适用场景等等都需要有比较深刻的理解,这样才能用好缓存,用对缓存。

最后复习一下ehcache中缓存的3种清空策略:

1 FIFO,first in first out,这个是大家最熟的,先进先出,不多讲了

2 LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。

2 LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

时间: 2024-08-29 13:30:42

细谈Ehcache页面缓存的使用的相关文章

spring 和 Ehcache web做页面缓存配置出异常?

问题描述 项目用的是spring mvc + hibernate 的结构.现在想用 Ehcache web做一个简单的页面缓存.网上找了很多例子但是就是报异常:Caused by: net.sf.ehcache.CacheException: Error configuring from file:/D:/workspace/sulai/webapp/WEB-INF/classes/ehcache.xml. Initial cause was Error configuring from inp

淘淘返还网和你细谈网站的三类关键词(下)

在上篇文章淘淘返还网和你细谈网站的三类关键词(上) 中,和大家分享了导航类关键词,主要是强调品牌的建设以及如何获取此类关键词的流量,今天接着上篇的内容,继续和大家分享交易类关键词与信息类关键词.这两类关键词不同与导航类关键词,需要我们注意的侧重点也不同. 交易类关键词:交易类关键词指的是用户比较有明显购买意图的关键词,这些词类似于前边提到的长尾关键词,比如"电视机五一促销"."哪个网站有最便宜的质量好的智能手机"等,这次词每天都会被大量搜索,根据统计,此类关键词的搜

站长总结:八个方面细谈网站易用性(二)

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 通过上篇文章<站长总结:八个方面细谈网站易用性(一) >,分别和大家从网页容易阅读.网站兼容性.无效链接.清晰导航等四个方面和大家分享易用性网站需要注意的事项,今天把剩余的几点给大家分享完. 第五.页面常见问题:页面常见问题看似可有可无,但对于访问者而言却是很重要的一环.虽然产品都有各种文字说明和文案,但总有些问题会困扰用户.所以

利用Spring MVC轻松实现页面缓存

缓存|页面 Spring的MVC是一个非常灵活的框架,可以无缝集成Struts/WebWork以及Velocity/Tapestry等View技术.Spring的DispatherServlet定义极为灵活,由于是开源框架,我们通过源代码,能轻松定制自己的处理流程. 为了实现页面缓存,可以改写DispatherServlet的doService()方法,这里提出一个解决方案: 利用WrappedResponse获得handler处理后的内容,然后缓存起来,这样在下次请求时,可以直接输出缓存内容.

禁止页面缓存的方法

缓存|页面 1, 在jsp或者servlet中加入 <%response.setHeader("Pragma","No-cache");response.setHeader("Cache-Control","no-cache");response.setDateHeader("Expires", 0);%> 2, 在页面中使用HTML标记,如下面: <HEAD><META ht

关于页面缓存清除的方法小结(整理)

缓存|页面      每次上Chinaasp总有不少的网友问及如何使Asp页面刷新,在IIS4的管理下页面的不刷新问题较IIS5严重得多,而且有时确实加入一些控制页面缓存的语句还是不起什么作用.原因我也不是很清楚,去问问微软吧:-)现在我将清除页面缓存的一些方法总结如下:1.在Asp页面首部加入Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl

关于页面缓存清除的方法小结

缓存|页面 每次上Chinaasp总有不少的网友问及如何使Asp页面刷新,在IIS4的管理下页面的不刷新问题较IIS5严重得多,而且有时确实加入一些控制页面缓存的语句还是不起什么作用.原因我也不是很清楚,去问问微软吧:-)现在我将清除页面缓存的一些方法总结如下:1.在Asp页面首部加入Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl = "n

热门不可怕:细谈热门关键词的四种优势

在做SEO的过程中,看到很多朋友越来越倾向长尾关键词,越来越意识到了长尾关键词的力量,我本人也是如此,但是这并不代表做站需要丢弃热门关键词.热门关键词作为流量的主要入口,依旧有非常重要的意义.今天和大家谈谈我的体会,细谈热门关键词的四种优势. 热门关键词总体的特点是检索量高.优化难度大.转化率低并需较多资源.所以摆在个人站长面前,热门关键词显得有些棘手.很多索性放弃热门词,主攻长尾和利基市场.但从另外一个方面来说,这些看似是劣势的特点也正是它们的优势所在.本文就从几个方面一一细谈,如有不对,请多

真实世界中的Rails,第2部分: 高级页面缓存

使用 JavaScript 和 cookies 扩展页面缓存 简介:通常,与用户相关的内容不适于使用页面缓存,原因是针对每个用户的内容会有细微的不同. 通过 JavaScript 和 cookies,甚至可以在显示某些自定义用户数据时采用页面缓存.本文将研究 Ruby on Rails 中的高级页面缓存. 有了页面缓存,Rails 就可以不再介入.在某种程度上,这是件好事 ,因为您的确可以获得优秀的性能.Rails 只需创建 HTML 页面,将其放入目录,之后,就可以置之于脑 后.从那时起,就由