1. 程式人生 > >EHCahe配置詳解(轉)

EHCahe配置詳解(轉)

    轉自EHCahe

    EHCache 是一個純java 的在程序中的快取, 它具有以下特性: 快速, 簡單, 為Hibernate2.1 充當可插入的快取, 最小的依賴性, 全面的文件和測試. 官方網站http://ehcache.sourceforge.net/

毫 無疑問, 幾乎所有的網站的首頁都是訪問率最高的, 而首頁上的資料來源又是非常廣泛的, 大多數來自不同的物件, 而且有可能來自不同的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 中:

maxElementsInMemory = "10"

maxElementsOnDisk = "10"

eternal = "false"

overflowToDisk = "true"

diskSpoolBufferSizeMB = "20"

timeToIdleSeconds = "10"

timeToLiveSeconds = "10"

memoryStoreEvictionPolicy = "LFU"

/>

SimplePageCachingFilter 是快取的名字,maxElementsInMemory 表示記憶體中SimplePageCachingFilter 快取中元素的最大數量為10 ,maxElementsOnDisk 是指持久化該快取的元素到硬碟上的最大數量也為10 ,eternal=false 意味著該快取會死亡.overflowToDisk=true 意思是表示當快取中元素的數量超過限制時, 就把這些元素持久化到硬碟,如果overflowToDisk 是false , 那麼maxElementsOnDisk 的設定就沒有什麼意義了.memoryStoreEvictionPolicy=LFU 是指按照快取的hit 值來清除, 也就是說快取滿了之後, 新的物件需要快取時,將會將快取中hit 值最小的物件清除出快取, 給新的物件騰出地方來了( 文章最後有ehcache 中自帶的3 種快取清空策略的介紹).

SimplePageCachingFilter 的配置,

indexCacheFilter

net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter

indexCacheFilter

*index.action

就只需要這麼多步驟, 我們就可以給某個頁面做一個快取的, 把上面這段配置放到你的web.xml 中, 那麼當你開啟首頁的時候, 你會發現,2 分鐘才會有一堆sql 語句出現在控制檯上. 當然你也可以調成5 分鐘, 總之一切都在控制中.

好了, 快取整個頁面看上去是非常的簡單, 甚至都不需要寫一行程式碼, 只需要幾行配置就行了, 夠簡單吧, 雖然看上去簡單, 但是事實上內部實現卻不簡單哦, 有興趣的話, 大家可以看看SimplePageCachingFilter 繼承體系的原始碼.

上面的配置針對的情況是快取首頁的全部, 如果你只想快取首頁的部分內容時, 你需要使用SimplePageFragmentCachingFilter 這個filter . 我們看一下如下片斷:

indexCacheFilter

net.sf.ehcache.constructs.web.filter.SimplePageFragmentCachingFilter

indexCacheFilter filter-name>

*/index_right.jsp

這個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 倆中快取機制:

· MemoryStore( 記憶體儲存)

· DiskStore( 磁碟儲存)

MemoryStore

MemoryStore 總是可用的, 但不可直接操作, 當中儲存著所有的Cache.

· 合適的Element 型別

所有的Element 都可以放在MemoryStore 中.

· 安全性: 使用多個執行緒並行檢查記憶體洩露.

· JDK: 使用了JDK1.5 的LinkedHashMap 來存放Elemen.t

· 快速的: 是最快的快取機制, 因為它是存放在記憶體中.

· 失效策略(Memory)

Cache 可以配置最大快取Element 的個數, 以及失效時間. 如果在新增Elemtent 時, 快取中的Element 個數達到了最大快取數並且 overflowToDisk 配置的屬性為true,Ehcache 會更具配置項MemoryStoreEvictionPolicy 的失效策略將 Element 輸出到磁碟. 如果overflowToDisk 為fasle,Ehcache 將刪除記憶體中Element.Ehcache 支援三種失效策略:LRU,LFU,FIFO.

值得注意的是快取中失效的Element 並不會別馬上清理掉, 所以想得到記憶體的真實大小應該呼叫方法calculateInMemorySize() 方法.

DiskStore

DiskStore 可快取到外部裝置上( 硬碟).

· DiskStores are Optional

Ehcache 從1.5 版本開始支援DiskStore. 如果你需要多個DiskStore 的話, 最好給他們配置不同的檔案路徑.

· 關閉磁碟快取: 只要註釋掉ehcache.xml 配置檔案中的磁碟快取配置項即可. 而ehcache-failsafe.xml 的磁碟快取配置不會影響到你自己的cache.

· 合適的Element 型別

這裡要注意要想使用磁碟快取, 快取的Element 必須實現序列化介面. 否則會丟擲NotSerializableException 異常.

· 儲存:Ehcache 會將每個快取配置的檔案路徑下建立一個cache_name.data 檔案, 如果使用的磁碟持久化技術, 還會生成一個cache name.index 檔案.

· 失效

Ehcache 有一個後臺執行緒專門做Ellment 失效監測以及清除工作. 設定執行緒執行間隔時間, 可通過設定diskExpiryThreadIntervalSeconds 屬性來完成, 此值不宜設定過低, 否則會導致清理執行緒佔用大量CPU 資源. 預設值是120 秒.

· 持久化

持 久化可在Element 的diskPersistent 配置項中配置, 如果配置為"false" 或是"omitted" 在CacheManager shutdown 或是startup 後, 用來快取Element 的檔案將被清除掉. 如果設定為"true",data 和index 檔案會被儲存下來, 對於新建立的CacheManager Element 也是可用的.

使用時必須顯示呼叫cache. Flush() 才會將資料快取到磁碟中.

磁碟快取步驟: 從MemoryStore 中把沒有失效的Element 重新整理到DiskStore,Element 被寫入到data 檔案,Element 將被序列化到index 檔案.

Ehcache 快取回收策略

緩 存回收就是當快取滿了的時候,Ehcache 會根據指定的策略來清理快取. 這裡的快取回收策略有別與Ehcache 中的失效清理策略. 失效清理策略是對失效的Element 進行批量清理時所採用的策略, 最終所有失效的Element 都將被清理, 只不過是清理的先後順序不同罷了.Ehcache 中快取的最大 Element 數是由maxElementsInMemory 來指定的. 當快取中的Element 個數達到maxElementsInMemory 指定的值時,Ehcache 會根據具體的策略來清理快取, 預設的策略是LRU( 最近最少使用).

磁碟快取大小預設是沒有限制的, 不過可通過maxElementsOnDisk 來指定. 當磁碟快取達到maxElementsOnDisk指定的值時,Ehcache 會清理磁碟中的快取使用預設策略是LFU( 使用頻率最低).

Make sure you are using a supported Java version.
Place the Ehcache jar into your classpath.
Ensure that any libraries required to satisfy dependencies are also in the classpath.
Configure ehcache.xml and place it in your classpath.
Optionally, configure an appropriate logging level.

Welcome to ehcache:http://ehcache.org/