关于缓存的话题,在坛子里已经有很多讨论,简单的来说,如果一个应用中 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>indexCacheFilter</filter-name> <filter-class> net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter </filter-class> </filter> <filter-mapping> <filter-name>indexCacheFilter</filter-name> <url-pattern>*index.action</url-pattern> </filter-mapping> 就只需要这么多步骤,我们就可以给某个页面做一个缓存的,把上面这段配置放到你的 web.xml 中,那么当你打开首页的时候,你会发现,2 分钟才会有一堆 sql 语句出现在控制 台上。当然你也可以调成 5 分钟,总之一切都在控制中。 好了,缓存整个页面看上去是非常的简单,甚至都不需要写一行代码,只需要几行配置 就行了,够简单吧,虽然看上去简单,但是事实上内部实现却不简单哦,有兴趣的话,大家 可以看看 SimplePageCachingFilter 继承体系的源代码。 上面的配置针对的情况是缓存首页的全部,如果你只想缓存首页的部分内容时,你需要 使用 SimplePageFragmentCachingFilter 这个 filter。我们看一下如下片断: <filter> <filter-name>indexCacheFilter</filter-name> <filter-class> net.sf.ehcache.constructs.web.filter.SimplePageFragmentCachingFilter </filter-class> </filter>
<filter-mapping> <filter-name>indexCacheFilter</filter-name> <url-pattern>*/index_right.jsp</url-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,最近最少使用的,缓存的元素有一个时间戳,当缓存容 量满了, 而又需要腾出地方来缓存新的元素的时候, 那么现有缓存元素中时间戳离当前时间 最远的元素将被清出缓存。
没有合适的资源?快使用搜索试试~ 我知道了~
ehcache项目缓存技术
共3个文件
txt:1个
jar:1个
xml:1个
3星 · 超过75%的资源 需积分: 10 10 下载量 91 浏览量
2012-02-17
17:23:28
上传
评论
收藏 205KB RAR 举报
温馨提示
ehcache项目缓存技术 ,大量用户需要访问主页的解决方案,缓存解决频繁操作某些数据的时候可能用到
资源推荐
资源详情
资源评论
收起资源包目录
缓存技术.rar (3个子文件)
缓存技术
页面缓存处理.txt 5KB
ehcache.xml 48KB
ehcache-1.2.4.jar 207KB
共 3 条
- 1
资源评论
- hukobe2013-08-06我以为是个例子,其实是对配置文件的说明,用处不大。
- 理工2322013-01-25没有解决我的问题
tsytdhs163
- 粉丝: 7
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功