`
kong0itey
  • 浏览: 305842 次
社区版块
存档分类
最新评论

使用ehcache来缓存页面

    博客分类:
  • java
 
阅读更多

关于缓存的话题,在坛子里已经有很多讨论,简单的来说,如果一个应用中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中:

Xml代码  收藏代码
  1. < cache   name = "SimplePageCachingFilter"   
  2.            maxElementsInMemory = "10"   
  3.            maxElementsOnDisk = "10"   
  4.            eternal = "false"   
  5.            overflowToDisk = "true"   
  6.            diskSpoolBufferSizeMB = "20"    
  7.            timeToIdleSeconds = "10"   
  8.            timeToLiveSeconds = "10"   
  9.            memoryStoreEvictionPolicy = "LFU"   
  10.             />   

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

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

Xml代码  收藏代码
  1. < filter >   
  2.     < filter-name > indexCacheFilter </ filter-name >   
  3.     < filter-class >   
  4.         net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter  
  5.     </ filter-class >   
  6. </ filter >   
  7.   
  8. < filter-mapping >   
  9.     < filter-name > indexCacheFilter </ filter-name >   
  10.     < url-pattern > *index.action </ url-pattern >   
  11. </ filter-mapping >   

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

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

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

Xml代码  收藏代码
  1. < filter >   
  2.     < filter-name > indexCacheFilter </ filter-name >   
  3.     < filter-class >   
  4.         net.sf.ehcache.constructs.web.filter.SimplePageFragmentCachingFilter  
  5.     </ filter-class >   
  6. </ filter >   
  7.   
  8. < filter-mapping >   
  9.     < filter-name > indexCacheFilter </ filter-name >   
  10.     < url-pattern > */index_right.jsp </ url-pattern >   
  11. </ 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页面缓存技术

    ehcache页面缓存技术ehcache页面缓存技术ehcache页面缓存技术ehcache页面缓存技术ehcache页面缓存技术ehcache页面缓存技术ehcache页面缓存技术ehcache页面缓存技术ehcache页面缓存技术ehcache页面缓存技术ehcache...

    细谈Ehcache页面缓存的使用

    ### 细谈Ehcache页面缓存的使用 在当今高度动态且数据密集型的应用环境中,缓存技术扮演着至关重要的角色。Ehcache作为一款高性能、轻量级的Java缓存框架,被广泛应用于各种场景中以提高系统的响应速度和整体性能。...

    Ehcache 整合Spring 使用页面、对象缓存

    ### Ehcache 整合Spring 使用页面、对象缓存 #### 一、Ehcache简介与特点 Ehcache是一款开源的、高性能的Java缓存框架,它可以用来存储、检索短期数据,以减轻数据库的压力,提高应用程序性能。Ehcache不仅支持...

    springMVC+Ehcache的各级缓存(包括页面缓存)

    SpringMVC和Ehcache的结合使用,能够构建一个高效、灵活的多级缓存系统,其中包括页面缓存。下面将详细介绍SpringMVC与Ehcache集成后的各级缓存机制以及页面缓存的实现。 1. SpringMVC简介: SpringMVC是Spring框架...

    Ehcache页面缓存的使用.doc

    总结起来,Ehcache页面缓存的使用涉及合理配置缓存的生命周期、大小限制以及淘汰策略,通过过滤器实现对请求的拦截和缓存内容的提供,以实现高效、低延迟的页面服务。在设计缓存策略时,要考虑到不同页面的访问特性...

    ehcache缓存页面

    Ehcache是一款广泛使用的Java缓存库,它能够有效提升应用程序性能,尤其是在处理高访问量的页面时。本文主要探讨如何利用Ehcache实现页面缓存,以及相关的配置和策略。 首先,理解Ehcache的两个关键参数: 1. `...

    项目优化之Ehcache页面缓存

    Ehcache是一款高效、流行的Java缓存库,它在项目优化中扮演着重要角色,尤其在处理前端页面缓存方面。本文将深入探讨Ehcache的工作原理、优势、配置以及如何将其应用于页面缓存,同时结合提供的代码案例和文档,帮助...

    ehcache缓存页面.doc

    **标题解析:** "ehcache缓存页面.doc" 这个标题表明了文档内容主要关于Ehcache,一个广泛使用的Java缓存库,用于提高应用程序性能。它可能详细介绍了Ehcache如何被用来缓存页面内容,以减少数据库查询和提升响应...

    ehcache配置拦截器缓存页面

    本文将深入探讨如何配置Ehcache作为拦截器来缓存页面,以此提升Web应用的性能。 首先,我们需要了解Ehcache的基本概念。Ehcache是一个开源的、内存级的缓存解决方案,它支持本地缓存和分布式缓存。通过在内存中存储...

    借助Ehcache缓存框架实现对页面的缓存Demo

    2、由于要实现Ehcache缓存页面,所以必须要添加“ehcache-web-2.0.4.jar” jar包,该jar包主要用于辅助Ehcache实现页面缓存 注意: 本web工程的发布不要使用Tomcat7,否则会出现如下异常: 2015-3-25 9:53:50 org....

    Spring4 整合EhCache实现 页面缓存 零配置

    在本文中,我们将深入探讨如何使用Spring4框架与EhCache进行整合,以实现零配置的页面缓存功能。EhCache是一个广泛使用的开源Java缓存解决方案,它提供了高效的内存和磁盘缓存机制,有助于提升应用程序性能。通过...

    Ehcache整合Spring使用页面、对象缓存

    Ehcache是一个流行的Java缓存库,常用于提高应用程序的性能和效率,通过存储经常访问的数据来减少数据库的负载。在Spring框架中整合Ehcache,可以实现页面和对象级别的缓存管理,从而优化Web应用的响应速度。下面将...

    Java流行ehcache缓存

    5. **Ehcache页面缓存的配置** - **类层次模型**:Ehcache的缓存管理基于层次结构,每个层级都可以有自己的缓存策略。 - **缓存对象**:使用`&lt;cache&gt;`元素定义具体的缓存对象,如网页、数据段等。 - **缓存操作**...

    缓存页面ehcache

    标题中的“缓存页面ehcache”指的是在软件开发中使用Ehcache作为缓存机制来优化页面加载速度的技术。Ehcache是一款广泛使用的开源Java缓存库,它能够有效地存储和检索数据,以减少对数据库的访问,提高系统的响应...

    Ehcache缓存技术

    另外,根据业务场景的不同,有时会使用缓存页面的方式来减少页面渲染时间,提升用户体验。例如,对于商品详情页这类数据变动不频繁的页面,可以将页面数据缓存起来,减少对数据库的访问次数。 Ehcache的使用案例...

    spirng3注解(annotation)与ehcache的对象、页面缓存

    例如,我们可以创建一个简单的缓存服务,使用`@Cacheable`注解来缓存某个计算密集型方法的结果: ```java @Service @CacheConfig(cacheNames = "myCache") public class CacheService { @Cacheable(key = "#id") ...

    spring使用ehcache实现页面缓存示例

    【Spring 使用 Ehcache 实现页面缓存】 在高并发的 Web 应用中,为了提高用户体验和减轻服务器压力,页面缓存是一种常见的优化手段。Spring 框架结合 Ehcache 提供了对页面缓存的支持,能够有效地加速静态或半静态...

    ehcache缓存教程

    **Ehcache缓存教程** Ehcache是一个广泛使用的开源Java缓存库,适用于各种Java应用程序,特别是...通过阅读提供的“ehcache缓存页面.doc”文档,可以获取更详细的配置示例和使用技巧,进一步提升你的Ehcache应用能力。

Global site tag (gtag.js) - Google Analytics