天天看點

Ehcache 整合Spring 使用頁面、對象緩存(轉)

Ehcache在很多項目中都出現過,用法也比較簡單。一般的加些配置就可以了,而且Ehcache可以對頁面、對象、資料進行緩存,同時支援叢集/分布式緩存。如果整合Spring、Hibernate也非常的簡單,Spring對Ehcache的支援也非常好。EHCache支援記憶體和磁盤的緩存,支援LRU、LFU和FIFO多種淘汰算法,支援分布式的Cache,可以作為Hibernate的緩存插件。同時它也能提供基于Filter的Cache,該Filter可以緩存響應的内容并采用Gzip壓縮提高響應速度。

如果你的系統中已經成功加入Spring、Hibernate;那麼你就可以進入下面Ehcache的準備工作。

1、 下載下傳jar包

2、 需要添加如下jar包到lib目錄下

ehcache-core-2.5.2.jar ehcache-web-2.0.4.jar 主要針對頁面緩存

3、 目前工程的src目錄中加入配置檔案

ehcache.xml ehcache.xsd 這些配置檔案在ehcache-core這個jar包中可以找到
頁面緩存主要用Filter過濾器對請求的url進行過濾,如果該url在緩存中出現。那麼頁面資料就從緩存對象中擷取,并以gzip壓縮後傳回。其速度是沒有壓縮緩存時速度的3-5倍,效率相當之高!其中頁面緩存的過濾器有CachingFilter,一般要擴充filter或是自定義Filter都繼承該CachingFilter。
CachingFilter功能可以對HTTP響應的内容進行緩存。這種方式緩存資料的粒度比較粗,例如緩存整張頁面。它的優點是使用簡單、效率高,缺點是不夠靈活,可重用程度不高。 EHCache使用SimplePageCachingFilter類實作Filter緩存。該類繼承自CachingFilter,有預設産生cache key的calculateKey()方法,該方法使用HTTP請求的URI和查詢條件來組成key。也可以自己實作一個Filter,同樣繼承CachingFilter類,然後覆寫calculateKey()方法,生成自定義的key。 CachingFilter輸出的資料會根據浏覽器發送的Accept-Encoding頭資訊進行Gzip壓縮。

在使用Gzip壓縮時,需注意兩個問題:

1. Filter在進行Gzip壓縮時,采用系統預設編碼,對于使用GBK編碼的中文網頁來說,需要将作業系統的語言設定為:zh_CN.GBK,否則會出現亂碼的問題。 2. 預設情況下CachingFilter會根據浏覽器發送的請求頭部所包含的Accept-Encoding參數值來判斷是否進行Gzip壓縮。雖然IE6/7浏覽器是支援Gzip壓縮的,但是在發送請求的時候卻不帶該參數。為了對IE6/7也能進行Gzip壓縮,可以通過繼承CachingFilter,實作自己的Filter,然後在具體的實作中覆寫方法acceptsGzipEncoding。 具體實作參考: protected boolean acceptsGzipEncoding(HttpServletRequest request) { boolean ie6 = headerContains(request, "User-Agent", "MSIE 6.0"); boolean ie7 = headerContains(request, "User-Agent", "MSIE 7.0"); return acceptsEncoding(request, "gzip") || ie6 || ie7; }

在ehcache.xml中加入如下配置

具體代碼:

這裡的PageEhCacheFilter繼承了SimplePageCachingFilter,一般情況下SimplePageCachingFilter就夠用了,這裡是為了滿足目前系統需求才做了覆寫操作。使用SimplePageCachingFilter需要在web.xml中配置cacheName,cacheName預設是SimplePageCachingFilter,對應ehcache.xml中的cache配置。

在web.xml中加入如下配置

當第一次請求這些頁面後,這些頁面就會被添加到緩存中,以後請求這些頁面将會從緩存中擷取。你可以在cache.jsp頁面中用小腳本來測試該頁面是否被緩存。<%=new Date()%>如果時間是變動的,則表示該頁面沒有被緩存或是緩存已經過期,否則則是在緩存狀态了。
對象緩存就是将查詢的資料,添加到緩存中,下次再次查詢的時候直接從緩存中擷取,而不去資料庫中查詢。 對象緩存一般是針對方法、類而來的,結合Spring的Aop對象、方法緩存就很簡單。這裡需要用到切面程式設計,用到了Spring的MethodInterceptor或是用@Aspect。

代碼如下:

這裡的方法攔截器主要是對你要攔截的類的方法進行攔截,然後判斷該方法的類路徑+方法名稱+參數值組合的cache key在緩存cache中是否存在。如果存在就從緩存中取出該對象,轉換成我們要的傳回類型。沒有的話就把該方法傳回的對象添加到緩存中即可。值得主意的是目前方法的參數和傳回值的對象類型需要序列化。 我們需要在src目錄下添加applicationContext.xml完成對MethodCacheInterceptor攔截器的配置,該配置主意是注入我們的cache對象,哪個cache來管理對象緩存,然後哪些類、方法參與該攔截器的掃描。

添加配置如下:

在ehcache.xml中添加如下cache配置