Eacache
cache
Spring Cache 整合 Ehcache Framework
2018/12/28 17:51:55
2
1937
Spring Cache 整合 Ehcache Framework
簡介 |
Spring 3.1 開始提供對Cache支援,類似於Transaction的使用方法與原理。本篇文章介紹如何使用Spring 提供的Cache機制資料,並整合Ehcache Framework。 |
作者 |
鄭筌唯 |
1. 前言
從Spring 3.1 開始提供對Cache的支援,類似於Transaction的使用方法與原理。適用於Cache Java Methods,減少邏輯運算的次數,每次都會檢核被呼叫的Method是否已被調用,如果曾經被調用,則會回傳Cache的結果且不執行邏輯運算,如果不曾被調用,則會執行邏輯運算且Cache運算後的結果,下次
調用該Method會回傳Cache的結果。如此一來當需要耗效能的Method將只會被執行一次。
Spring 的提供與其他服務相同,都是abstraction的類別可以使用第三方套件實作。Ehcache是廣泛的使用於 Java 的Open Source F
rameworks,據有以下幾個特點:
1.1 快速且輕量化:
Ehcache是為廣泛、大量使用 Concurrency Systems 所設計。
大量的性能測試保持每個版本的性能一致。
許多使用者不知道在使用 Ehcache,因為不需要特別的初始配置。
API很容易使用,很簡單就能運作。
最小的依賴:唯一的依賴是SLF4J。
1.2 可延展性:
Cache 資料可儲存於記憶體或硬碟,且為大量Cache做過測試。
可支援數百條Caches。
為高Concurrent讀取和多CPU Servers做優化。
通過Terracotta Server Array,可擴充至數百個節點。
1.3 靈活度:
支援基於Cache及Element的過期策略,Cache的資料存活時間是可以控制的。
提供LRU、LFU和FIFO緩存策略。
1.4 標準規範:
對JSR107 JCACHE API 完整的實現。
1.5 擴展性:
允許透過CacheManagerEventListener 註冊 Cache Manage Listeners 並使用 notifyCacheAdded()與 notifyCacheRemoved()兩個Method。
允許透過CacheEventListener 註冊 Cache Event Listeners,提供許多Cache後的處理機制,可用的Method為:notifyElementRemoved、
notifyElement
Put、
notifyElement
Updated、
notifyElement
Expired。
2. 相關設定
在Spring上使用Ehcache機制需要以下Jar擋:Spring-Context.jar、Spring-Context_Support.jar、Ehcache.jar及Slf4j.jar。
Maven設定如下:

Spring configuration 設定檔配置:

<cache:annotation-driven cache-manager="cacheManager"/>,用來指定cacheManager對應的Bean,預設為cacheManager,
當id同樣為
cacheManager時,也可以簡寫成
<cache:annotation-driven/>,等同於
@EnableCaching
。
EhcacheMeneger:支援Ehcache的CacheManager。
EhcacheManagerFactoryBean:用來指定 ehcache.xml。
Ehcache.xml設定:

diskStore:Ehcache支援記憶體及硬碟的儲存方式,
Path指定硬碟儲存的位置,
java.io.tmpdir 臨時的儲存位置。
cache:每個Cache Element都代表Ehcache對Cache資料的定義。
name:指定名稱,透過名稱取得特定的Cache資料。
maxEntriesLocalHeap:記憶體內可以儲存的元素數量,0代表無限,等同於maxElementsInMemory。
eternal:若為true,Cache的元素將永遠不會失效也不會被清除,因此timeToIdleSeconds及timeToLiveSeconds會被忽略。
timeToIdleSeconds:元素可被閒置的時間,時間內都沒被呼叫便會失效,單位為秒,0代表無限。
timeToLiveSeconds:元素的生命週期,無論是否被閒置,時間到便會失效,單位為秒,0代表無限。
overflowToDisk:當記憶體不足時,是否儲存至硬碟。
maxEntriesLocalDisk:
硬碟可以儲存的元素數量,0代表無限。
diskExpiryThreadIntervalSeconds:硬碟內儲存的資料多久檢查是否失效,單位為秒,default 為120秒。
memoryStoreEvictionPolicy:當達到maxEntriesLocalHeap限制時,會依指定的方式去清除,default為LRU(最近最少使用),
另外還有FIFO(先進先出)與LFU(較少使用)。
3. 實際應用
Spring 對Cache的支援類似於Transaction的支援,透過AOP的方式在調用前後取得參數及回傳值。使用方式同Transaction,只需要在Method上宣告Annotation即可,共有三個Annotation可被宣告:@Cacheable、@Cacheput及@CacheEvict。
@Cacheable:會在第一次執行Method時把結果Cache,在Cache的資料尚未失效前,再次執行Method會直接返回結果,不會再執行程式,可使用一些參數設定Cache資料條件。
value:對應Ehcache.xml中聲明的name,指定對應的Cache設定,不可為空值。
key:default為空,相同的Key會返回相同的結果,支援SpEL,加上#可以引用參數值當Key。
condition:default為空,滿足設定條件後才會執行Cache,同樣支援SpEL。

@CachePut:無論是否有Cache,都會執行程式後再次Cache資料,可使用的參數與@Cacheable一樣。可與@Cacheable搭配使用,需要變更的資料用@CachePut寫入,只要Key是相同的,用@Cacheable調用會返回變更後的結果。

@CacheEvict:用來刪除Cache資料,
可使用的參數value、key、condition與allEntries,參數設定與@Cacheable相同。
allEntries:default為false,若為true會清除value內所有Cache。

4. 結語
善用Cache可提升效能,Spring 提供Cache的接口,同時支援Ehcache的實作。Ehcace具有簡單、快速、多種Cache及清除機制等特點,可搭配redis來達到更完善的機制。