Ehcache介紹及整合Spring實現快取記憶體

茅坤寶駿氹發表於2018-05-04

轉載自 Ehcache介紹及整合Spring實現快取記憶體


Ehcache介紹


EhCache 是一個純Java的程式內快取框架,具有快速、精幹等特點,是Hibernate中預設的CacheProvider。它使用的是JVM的堆記憶體,超過記憶體可以設定快取到磁碟,企業版的可以使用JVM堆外的實體記憶體。


Spring整合Ehcache




首先加入最新的ehcache的maven依賴


<!-- ehcache -->

<dependency>

        <groupId>net.sf.ehcache</groupId>

        <artifactId>ehcache</artifactId>

        <version>2.10.4</version>

</dependency>


在Spring配置檔案中加入如下配置


<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">

        <property name="configLocation" value="classpath:ehcache.xml" />

</bean>


<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">

        <property name="cacheManager" ref="ehcache" />

</bean>

<cache:annotation-driven cache-manager="cacheManager" />


在classpath中加入ehcache的配置檔案ehcache.xml


<?xml version="1.0" encoding="UTF-8"?>

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:noNamespaceSchemaLocation="ehcache.xsd"

         updateCheck="false" 

         monitoring="autodetect"

         dynamicConfig="true"

         maxBytesLocalHeap="800M"

         maxBytesLocalDisk="200G">


    <diskStore path="./cache"/>


    <!-- 永不過期 -->

    <defaultCache 

         eternal="true"  

            overflowToDisk="true"  

            diskPersistent="true"  

            memoryStoreEvictionPolicy="LRU" 

   />

        

   <!-- 快取一天 -->

   <cache name="oneDayCache" 

         eternal="false"  

            timeToIdleSeconds="0" 

            timeToLiveSeconds="86400" 

            overflowToDisk="true"  

            diskPersistent="true"  

            diskExpiryThreadIntervalSeconds="1800" 

            memoryStoreEvictionPolicy="LRU" 

    /> 

</ehcache>


配置檔案說明


Spring Cache的Cacheable註解不支援失效時間設定,所以只能在ehcache.xml上面設計快取。上面的配置檔案配置了兩種快取,一種永久不過期的,一種快取1小時,更多時限的在後面加就行。


引數說明


updateCheck: 建議關閉ehcache的自動更新,不然每次啟動都要去官網更新

monitoring:自動檢測

dynamicConfig: 支援動態改變配置


maxBytesLocalHeap: 最大堆記憶體使用,單位可為K,M,G

maxBytesLocalDisk: 最大磁碟使用,單位可為K,M,G


maxBytesLocalHeap、maxBytesLocalDisk這兩個是定義在總配置上的,不過也可以指定到具體的快取上面去,不過最大容量以總配置上面的大小為準。


diskStore:指定資料儲存位置,可指定磁碟中的資料夾位置

defaultCache: 預設的管理策略  


以下屬性是必須的


name: Cache的名稱,必須是唯一的,ehcache會把這個cache放到HashMap裡去。


maxElementsInMemory:在記憶體中快取的element的最大數目。

maxElementsOnDisk:在磁碟上快取的element的最大數目,預設值為0,表示不限制。  

 

eternal:設定快取的elements是否永遠不過期。如果為true,則快取的資料始終有效,如果為false那麼還要根據timeToIdleSeconds,timeToLiveSeconds判斷。   


overflowToDisk: 如果記憶體中資料超過記憶體限制,是否要快取到磁碟上。   

  

以下屬性是可選的:  

timeToIdleSeconds: 物件空閒時間,指物件在多長時間沒有被訪問就會失效。只對eternal為false的有效。預設值0,表示一直可以訪問。 

 

timeToLiveSeconds: 物件存活時間,指物件從建立到失效所需要的時間。只對eternal為false的有效。預設值0,表示一直可以訪問。  


diskPersistent: 是否在磁碟上持久化。指重啟jvm後,資料是否有效。預設為false。   


diskExpiryThreadIntervalSeconds: 物件檢測執行緒執行時間間隔。標識物件狀態的執行緒多長時間執行一次。   


diskSpoolBufferSizeMB: DiskStore使用的磁碟大小,預設值30MB。每個cache使用各自的DiskStore。   


memoryStoreEvictionPolicy: 如果記憶體中資料超過記憶體限制,向磁碟快取時的策略。預設值LRU,可選FIFO、LFU。   


快取的3 種清空策略

FIFO-first in first out (先進先出)。

LFU-Less Frequently Used (最少使用),意思是一直以來最少被使用的。快取的元素有一個hit 屬性,hit 值最小的將會被清出快取。  

LRU -Least Recently Used(最近最少使用),(ehcache 預設值).快取的元素有一個時間戳,當快取容量滿了,而又需要騰出地方來快取新的元素的時候,那麼現有快取元素中時間戳離當前時間最遠的元素將被清出快取。



快取使用


使用Spring提供的註解即可,傳入vaue,key等註解需要的引數。



@Cacheable:先查快取,有則不進行方法,沒有就進行方法再快取起來。


@CachePut:每次都執行方法,再放入快取。


@CacheEvict:讓快取失效。


@Caching:以上3種註解可以組合使用。


相關文章