s2sh项目整合ehcache页面缓存

网上用ehcache做对象缓存和数据库缓存的比较多。但仔细一想,直接做页面缓存显然更好,直接点不用绕路。
本人用的是s2sh开发网站,整合了urlrewrite.其实最后页面路径配置时也是用的struts2的路径。
网上的比较多的就是直接给出配置文件。

首先网上查了下,ehcache和oscache,上相应的官网查看,发现oscache到07年以后就没更新过,不知道是改名字了,还是其它原因,最后采用了ehcache做页面缓存

配置可以参考官方页面: http://ehcache.org/documentation/web_caching.html

web里面配置如下:
  < filter >
    
< filter-name > CachePage1CachingFilter </ filter-name >
    
< filter-class > net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter
    
</ filter-class >
    
< init-param >
      
< param-name > suppressStackTraces </ param-name >
      
< param-value > false </ param-value >
    
</ init-param >
    
< init-param >
      
< param-name > cacheName </ param-name >
      
< param-value > CachePage1CachingFilter </ param-value >
    
</ init-param >
  
</ filter >

  
< filter >
    
< filter-name > SimplePageFragmentCachingFilter </ filter-name >
    
< filter-class > net.sf.ehcache.constructs.web.filter.SimplePageFragmentCachingFilter
    
</ filter-class >
    
< init-param >
      
< param-name > suppressStackTraces </ param-name >
      
< param-value > false </ param-value >
    
</ init-param >
    
< init-param >
      
< param-name > cacheName </ param-name >
      
< param-value > SimplePageFragmentCachingFilter </ param-value >
    
</ init-param >
  
</ filter >

  
< filter >
    
< filter-name > SimpleCachingHeadersPageCachingFilter </ filter-name >
    
< filter-class > net.sf.ehcache.constructs.web.filter.SimpleCachingHeadersPageCachingFilter
    
</ filter-class >
    
< init-param >
      
< param-name > suppressStackTraces </ param-name >
      
< param-value > false </ param-value >
    
</ init-param >
    
< init-param >
      
< param-name > cacheName </ param-name >
      
< param-value > CachedPage2Cache </ param-value >
    
</ init-param >

  
</ filter >

  
<!--  This is a filter chain. They are executed in the order below.
  Do not change the order. 
-->
  
< filter-mapping >
    
< filter-name > CachePage1CachingFilter </ filter-name >
    
< url-pattern > /CachedPage.jsp </ url-pattern >
    
< dispatcher > REQUEST </ dispatcher >
    
< dispatcher > INCLUDE </ dispatcher >
    
< dispatcher > FORWARD </ dispatcher >
  
</ filter-mapping >

  
< filter-mapping >
    
< filter-name > SimplePageFragmentCachingFilter </ filter-name >
    
< url-pattern > /include/Footer.jsp </ url-pattern >
  
</ filter-mapping >

  
< filter-mapping >
    
< filter-name > SimplePageFragmentCachingFilter </ filter-name >
    
< url-pattern > /fragment/CachedFragment.jsp </ url-pattern >
  
</ filter-mapping >

  
< filter-mapping >
    
< filter-name > SimpleCachingHeadersPageCachingFilter </ filter-name >
    
< url-pattern > /CachedPage2.jsp </ url-pattern >
  
</ filter-mapping >
ehcache.xml文件要放在src下面。
< Ehcache  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation
="../../main/config/ehcache.xsd" >

    
< diskStore  path ="java.io.tmpdir" />


    
< defaultCache
            
maxElementsInMemory ="10"
            eternal
="false"
            timeToIdleSeconds
="5"
            timeToLiveSeconds
="10"
            overflowToDisk
="true"
            
/>



    
<!--  Page and Page Fragment Caches  -->

    
< cache  name ="CachePage1CachingFilter"
           maxElementsInMemory
="10"
           eternal
="false"
           timeToIdleSeconds
="10000"
           timeToLiveSeconds
="10000"
           overflowToDisk
="true" >
    
</ cache >

    
< cache  name ="CachedPage2Cache"
           maxElementsInMemory
="10"
           eternal
="false"
           timeToLiveSeconds
="3600"
           overflowToDisk
="true" >
    
</ cache >

    
< cache  name ="SimplePageFragmentCachingFilter"
           maxElementsInMemory
="10"
           eternal
="false"
           timeToIdleSeconds
="10000"
           timeToLiveSeconds
="10000"
           overflowToDisk
="true" >
    
</ cache >

    
< cache  name ="SimpleCachingHeadersTimeoutPageCachingFilter"
           maxElementsInMemory
="10"
           eternal
="false"
           timeToIdleSeconds
="10000"
           timeToLiveSeconds
="10000"
           overflowToDisk
="true" >
    
</ cache >

</ ehcache >

现在的问题是有些页面要更新,在内存或者硬盘上的数据需要更新,而且是实时的。应该怎么办,网上多的也是对象的操作,基本没有缓存页面的操作。
首先说下缓存页面的大概方法。
ehcache.xml里面对应web.xml,name都一样的,比如一个具体路径,show.action?showId=1,配置如下:
 <filter-mapping>
    <filter-name>show</filter-name>
   <url-pattern>/show.action</url-pattern>
  </filter-mapping>
取前面的部分就可以了。对应ehcache.xml配置:

<!--

            maxElementsInMemory="10"内存中的最大页面对象
            eternal="false"
            timeToIdleSeconds="120"   timeToIdleSeconds ,多长时间不访问该缓存,那么ehcache 就会清除该缓存。           
            timeToLiveSeconds="240" timeToLiveSeconds ,缓存的存活时间,从开始创建的时间算起。
            overflowToDisk="true"     是否写入硬盘


-->
    <!-- Page and Page Fragment Caches -->

    <cache name="show"
           maxElementsInMemory="10"
           eternal="false"
           timeToIdleSeconds="30"
           timeToLiveSeconds="60"
           overflowToDisk="true">
    </cache>

这里只有一个cache,在ehcache即对应一个Ehcache对象,由CacheManager(单例模式实现)去管理,在CacheManager里用配置文件中的name可以获取Ehcache对象的实例。
代码如下:
Ehcache cache = CacheManager.getInstance().getEhcache(cacheName);

展示页面有很多,比如一个商家一个展示页面,即show.action?showId=1后面的数字是可变的,在ehcache里面是用map去存储的,比如show.action?showId=1对应的key为:
GET/show.actionshowId=1
GET为访问方式,把问号去掉了,ehcache内部也是这样存储的(类似map),这样保证了请求的页面在内存中的唯一性,获取也快。
既然key都知道了,删除就好了,直接 查看api文档Ehcache里有很多remove方法。示例代码如下:
Ehcache cache = CacheManager.getInstance().getEhcache(cacheName);
  if (null == cache) {
   return;
  }
  cache.remove(key);

key的获取就不用多说了吧,当更新一个页面的数据时,肯定知道数据的id,直接字符串处理下就可以获取key了,这里注意下就是,代码编写时,一般url里都有项目的名字,正式发布时,肯定没有,而前者在ehcache里生成key里有项目的名字,即:
GET/projetName/show.actionshowId=1
所以最好用spring注入值,到时改也方便。

更详细的,请查看api文档和测试下,官方文档给的都是对象的,页面缓存的给的比较少,我也是查看源码才得出上面代码。
记一下,希望帮助有需求的人。




天苍苍,野茫茫,风吹草底见牛羊

你可能感兴趣的:(s2sh项目整合ehcache页面缓存)