Eacache cache

Spring Cache 整合 Ehcache Framework

鄭筌唯 2018/12/28 17:51:55
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來達到更完善的機制。
鄭筌唯