asdtiang的博客 感謝blogjava提供的博客交流平臺

          s2sh項目整合ehcache頁面緩存

          Posted on 2011-03-08 15:23 asdtiang 閱讀(2519) 評論(0)  編輯  收藏 所屬分類: java ee
          網上用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文檔和測試下,官方文檔給的都是對象的,頁面緩存的給的比較少,我也是查看源碼才得出上面代碼。
          記一下,希望幫助有需求的人。




          天蒼蒼,野茫茫,風吹草底見牛羊

          posts - 80, comments - 24, trackbacks - 0, articles - 32

          Copyright © asdtiang

          asdtiang的博客 PaidMailz
          點擊廣告網賺A(每天4個廣告,每個0.0025美元,一個搜索廣告0.03美元)
          主站蜘蛛池模板: 漳平市| 丁青县| 黎城县| 洛扎县| 望谟县| 祁门县| 阜新| 平罗县| 英山县| 容城县| 凤城市| 南充市| 恭城| 化德县| 宁晋县| 喀喇沁旗| 广德县| 霍邱县| 虎林市| 荣昌县| 南郑县| 革吉县| 望谟县| 长泰县| 兰坪| 尼勒克县| 怀来县| 邵阳县| 湖口县| 左权县| 新源县| 延津县| 城步| 黄梅县| 大连市| 鄢陵县| 安图县| 顺昌县| 保康县| 炎陵县| 普洱|