页面缓存
目录
1 SimplePageCachingFilter
1.1 calculateKey
1.2 可配置的初始化参数
1.2.1 cacheName
1.2.2 blockingTimeoutMillis
2 SimpleCachingHeadersPageCachingFilter
3 SimplePageFragmentCachingFilter
Ehcache除了支持对象的缓存之外,还可以对Web页面进行缓存。这是通过ehcache-web模块下的Filter支持的。Ehcache会自动对Response进行gzip压缩,并且将压缩后的内容保存在缓存中。如果客户端是支持gzip的,那么服务端将直接返回gzip之后的Response,否则将从缓存中提取出来对应的Response进行解压缩,然后再返回给客户端。如果客户端是支持gzip的,那么它必须在请求的Header中包含“Accept-Encoding: gzip”。
1 SimplePageCachingFilter
这是ehcache-web模块下页面缓存Filter的一个简单实现,适用于可以压缩的Http响应(response),如HTML、XML、JSON等。它会使用通过CacheManager的静态方法create创建的单例CacheManager,这样如果之前已经存在CacheManager的实例了的话,这里就会直接拿来用,而不会再创建了。所以这里一般默认情况下会取类根路径下的ehcache.xml文件或ehcache-failsafe.xml文件来创建CacheManager,但如果我们的项目中整合了Ehcache和Spring,且在Spring配置文件中指定的Ehcache的配置文件不是默认位置的话,Spring将使用指定的配置文件优先初始化CacheManager,这样SimplePageCachingFilter中要使用CacheManager时就不会再初始化了,而是直接使用Spring初始化的。
SimplePageCachingFilter适用于缓存整个页面的情况,如果只需要缓存某一个片段,如使用jsp:include包含的部分,请使用SimplePageFragmentCachingFilter。
1.1 calculateKey
我们都知道,Ehcache是以键值对的形式保存元素的,对于页面的缓存也不例外。页面缓存使用的key是通过SimplePageCachingFilter的calculateKey()方法获取的。其内部逻辑是获取请求时的URI及后面的查询字符串作为key进行返回,如“/user/index.jsp?name=abc”,这使得它的应用范围非常广。它不依赖于主机名和端口号,这将使得它同样适用于有多个域或多个端口请求同样内容的情况。如果有需要,我们可以对calculateKey方法进行重写,从而实现我们自己的计算key的逻辑。
1.2 可配置的初始化参数
对于SimplePageCachingFilter而言,可配置的初始化参数有两个,cacheName和blockingTimeoutMillis。
1.2.1 cacheName
在使用SimplePageCachingFilter时,我们需要通过初始化参数cacheName(init-param)指定当前Filter用于缓存的Cache的名称,对应于Ehcache配置文件中Cache的名称,默认为SimplePageCachingFilter。
- <filter>
- <filter-name>ehcacheFilter</filter-name>
- <filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter</filter-class>
- <init-param>
- <param-name>cacheName</param-name>
- <param-value>webPageCache</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>ehcacheFilter</filter-name>
- <url-pattern>/index.jsp</url-pattern>
- <dispatcher>FORWARD</dispatcher>
- <dispatcher>INCLUDE</dispatcher>
- <dispatcher>REQUEST</dispatcher>
- </filter-mapping>
1.2.2 blockingTimeoutMillis
在多线程并发的情况下,为了避免多个线程请求同一个key而做重复的无用的工作, CachingFilter底层使用的是BlockingCache,如果提供的Cache不是BlockingCache,那么Ehcache将使用BlockingCache对当前Cache进行封装。BlockingCache允许并发读已经存在于cache中元素,但是如果进行读操作的时候对应的元素是不存在的,那么除第一个获取到锁(Lock)的线程之外的线程都会被阻塞起来,直到有线程往里面放置了对应的元素为止。默认情况下,如果第一个线程没有往Cache里面put对应的元素的话,这些线程会一直处于等待状态,这样时间长了之后服务端会因为拥有太多请求的连接没有返回而难堪重负。为此,我们可以在定义CachingFilter时通过初始化参数blockingTimeoutMillis来解决这一问题。通过设置blockingTimeoutMillis参数,BlockingCache最多只会阻塞指定的时间,即被阻塞的线程只会最多阻塞给定的时间,之后如果超时的话会抛出LockTimeoutException。
2 SimpleCachingHeadersPageCachingFilter
SimpleCachingHeadersPageCachingFilter继承自SimplePageCachingFilter,以提供HTTP缓存头信息。也就是说使用SimpleCachingHeadersPageCachingFilter与使用SimplePageCachingFilter几乎是一样的。所不同的是前者在构建返回信息的时候会设置“Last-Modified、Expires、Cache-Control、ETag”这四个缓存头信息,如果在设置之前这些信息已经存在的话,那么它们将会被忽略,而直接使用SimpleCachingHeadersPageCachingFilter重新生成过的。
由于浏览器和其它HTTP客户端都拥有包含在返回信息头中的过期信息,以至于在信息未过期前,它们不需要再次请求对应的页面。SimplePageCachingFilter是没有设置这些头信息的,那也就意味着使用SimplePageCachingFilter时每次客户端都需要向服务端请求页面。那你为什么还要用SimplePageCachingFilter呢?考虑这样一种场景,我们有一个页面包含了动态数据,我们对它进行了缓存,如果使用SimpleCachingHeadersPageCachingFilter的话,返回头信息中会包括过期信息,这也就意味着在客户端本地缓存的页面过期之前它不会再向服务端请求对应的页面,而如果此时服务端更新了这个页面的缓存,或者是移除了这个缓存,之前在本地缓存过该页面的客户端只能等到其本地的信息正常超时后才能得到服务端更新的页面。而此时如果我们使用的是SimplePageCachingFilter的话,由于没有过期等缓存头信息,客户端每次都会向服务端发起请求,这样服务端页面有变化时客户端都能即时获取到更新。在这种情况下,缓存的作用是减少服务端的负载,而不是减少浏览器的请求。
SimpleCachingHeadersPageCachingFilter缓存的页面信息是包含“Last-Modified、Expires、Cache-Control、ETag”这四个头信息的。这样当缓存中存在对应的页面时,所有的请求获取到的页面的头信息都会是一样的。
3 SimplePageFragmentCachingFilter
SimplePageFragmentCachingFilter适用于对使用jsp:include包含的页面的缓存。除了不对Response进行gzip之外,SimplePageFragmentCachingFilter能做所有SimplePageCachingFilter能做的事情,这里就不对SimplePageFragmentCachingFilter做过多重复的介绍了。
(注:本文是基于ehcache2.8.1和ehcache-web2.0.4所写)
摘自:http://haohaoxuexi.iteye.com/blog/2121782
相关推荐
在本篇《Mybatis入门实例(二)——添加ehcache缓存支持》中,我们将深入探讨如何在Mybatis框架中集成Ehcache作为二级缓存,以提高数据访问的效率和性能。Ehcache是一个开源的Java分布式缓存,广泛用于缓存应用程序中...
此外,Ehcache还提供了一个Web管理界面——`Ehcache Web Console`,通过HTTP接口展示实时的缓存统计信息,方便开发者进行远程监控。 在Ehcache的配置文件(通常是ehcache.xml)中,我们可以设置监控相关的参数,...
标题“memcached完全剖析ehcache memcached redis 缓存技术总结”表明,这篇内容将深入探讨三种流行的缓存技术——Memcached、Ehcache和Redis。缓存是IT行业中用于提高系统性能的关键技术,尤其是在大数据量和高并发...
Ehcache是一款高性能、广泛使用的Java缓存库,它的独立服务器版本——ehcache-standalone-server-1.0.0-distribution.tar.gz,是专为处理大规模数据缓存需求而设计的解决方案。这个压缩包包含了运行Ehcache独立...
这里我们关注的是Ehcache的核心库,具体是三个不同版本——ehcache-core-2.6.11,ehcache-core-2.6.9,以及ehcache-core-2.5.0。 1. Ehcache核心功能: Ehcache的核心功能包括内存缓存、磁盘缓存、分布式缓存以及...
本文将详细探讨两种广泛使用的缓存解决方案——Ehcache和Memcached,它们都是为了减少对数据库的直接访问,从而提升系统的响应速度。我们将从性能、特性、适用场景等方面进行比较。 首先,Ehcache是一款基于Java的...
它主要通过利用两种不同级别的内存——通常是CPU缓存和硬盘上的磁盘缓存——来减少数据读取的延迟,提高用户体验。本文将深入探讨双缓存的概念、工作原理以及在实际Web应用中的应用。 首先,理解缓存的基本原理是至...
本文将深入探讨Hibernate性能优化中的一个重要概念——一级缓存,并结合给出的压缩包文件“hibernate_cache_level1”,来详细解析一级缓存的工作原理及其优化策略。 一级缓存是Hibernate内置的一种缓存机制,它存在...
9. **缓存机制**:为了提高性能,系统可能使用了缓存技术,如Ehcache或Redis,对频繁访问的数据进行缓存,减少数据库查询压力。 10. **部署与配置**:源码部署在Tomcat、Jetty等Java应用服务器上,通过修改server....
技术选型初步技术: 撑杆春天冬眠EhCache——缓存框架JSP前端技术: jQuery的引导程序UEditor——在线HTML编辑器模块介绍公共类设计Web.xml中配置Struts及初始化Spring容器,准备WEB-INF路径下applicationContex.xml...
这包括但不限于:合理使用缓存技术(如Ehcache、Redis),优化数据库查询,减少HTTP请求,使用CDN加速静态资源加载,以及通过线程池优化并发处理等。 在“高级编程源码”中,我们可以期待看到这些技术的实际应用和...
Ehcache是一款开源的Java分布式缓存,它可以极大地提高应用程序的性能,通过缓存频繁访问的数据,减少了对数据库的依赖,提升了系统的响应速度。在jfinal blog中,Ehcache可能用于缓存热门文章、用户信息等,以减少...
- 为了提高性能,可能使用了缓存技术,如 Ehcache 或 Memcached。 - 数据库优化,如合理设计数据库表结构,使用索引,避免N+1查询等。 7. **项目结构**: - 通常,一个JSP项目会有清晰的目录结构,包括src、...
Spring Cache抽象层提供了一种通用的缓存解决方案,可以集成不同的缓存实现,如Redis、 EhCache等。通过`@Cacheable`、`@CacheEvict`等注解,可以在方法级别实现缓存的存取和清除。 **6. Redis与MySQL数据同步** 在...
- **缓存机制**:一级缓存(Session)和二级缓存(例如,Ehcache)可以提高数据访问性能。 3. **Web Service** Web Service是一种基于标准的、平台无关的、松耦合的远程调用技术,使用XML来传输数据。本实例中,...
- 为了提高系统性能,可能采用了缓存技术,如使用Ehcache或Redis来缓存频繁访问的数据。此外,JSP页面的优化,如减少不必要的服务器端计算和减少HTTP请求,也是提升系统性能的重要手段。 通过对北雨影音系统的JSP...
高性能论坛通常会使用缓存技术来提高响应速度,比如使用Ehcache或Redis。通过JiveJdon的源代码,我们可以了解如何在实际项目中实现缓存,提升用户体验。 7. **多线程与并发** 在高并发环境下,多线程处理是必不可...
Ehcache - Camel 缓存实现; Maven 的生命周期支持; 单元测试( jUnit启动嵌入式Jetty进行测试) 环境 应用程序是通过以下方式创建的: JDK 8u40 Tomcat 8.0.* 技术栈 阿帕奇骆驼 2.15 Spring 4.1(上下文) ...
而Ehcache则是另一种广泛使用的Java缓存库,它允许开发者在内存和磁盘之间进行缓存管理,进一步提升系统性能。 数据库方面,提供了两个SQL脚本文件——`luban.sql`和`luban(如果报错请执行这个兼容版本).sql`,它们...