Ehcach SimplePageCachingFilter 页面缓存
作者:韩飞
日期:2008/11/19
为了能将学过的东西归纳总结,开始试验着写一些文档,看过张荣华的文章后,参考着写一下
如果一个应用中的80%的时间在访问20%的数据时,那么这时候就应该考虑使用缓存了。在一个网站中访问最多的可能就是首页了,我们可以考虑给首页做一个页面缓存。主页的缓存策略应该是在一个固定时间内不变的,比如说2分钟更新一次,那么这个缓存应该做在什么地方呢?
假设你的应用结构是page—filter—action—service—dao—db,这个过程中的每个地方都一个做缓存,根据页面缓存的特征,应该把页面缓存做在尽量靠近客户端的地方,就是page和filter之间。这样的优点就是在用户第一次请求之后,页面被缓存,第二个用户再来请求时,走到filter这个请求就结束了。无需在走后面的action—service—dao—db,这样就减轻了服务器的压力,客户端的页面响应速度也加快
下面用ehcache来做到这一点
在应用的classes的根目录中放入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 是指持久化的该缓存元素的硬盘是的最大数量
eternal=false 意味着该缓存会死亡
overflowToDisk=true 意味着该缓存中的元素超过限制是,就把这些元素持化到硬盘上,如果orerflowToDisk=false那么maxElementsOnDisk的设置就没有意义了
timeToIdleSeconds 多长时间不访问该缓存,那么ehcache就会清除改缓存
timeToLiveSeconds 缓存的存活时间,从开始创建的时间算起
memoryStoreEvictionPolicy=LFU
1 FIFO ,first in first out ,这个是大家最熟的,先进先出,不多讲了
2 LFU , Less Frequently Used ,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。
3 LRU ,Least Recently Used ,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
配置SimplePageCachingFilter 在web.xml中加入
< filter >
< filter-name > indexCacheFilter <filter-name >
< filter-class > net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter
<filter-class >
<filter >
< filter-mapping >
< filter-name > indexCacheFilter< filter-name >
< url-pattern > *.do <url-pattern >
<filter-mapping >
好了,如果你的页面正好也需要用到页面缓存,不防可以考虑一下ehcache ,因为它实在是非常简单,而且易用。
ehcache 是一个非常轻量级的缓存实现,而且从1.2 之后就支持了集群,目前的最新版本是1.3 ,而且是hibernate 默认的缓存provider 。虽然本文是介绍的是ehcache 对页面缓存的支持,但是ehcache 的功能远不止如此,当然要使用好缓存,对JEE 中缓存的原理,使用范围,适用场景等等都需要有比较深刻的理解,这样才能用好缓存,用对缓存。