Ehcache使用的參數說明java
1.ehcache.xml中參數說明緩存
ehcache.xml文件:spa
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <diskStore path="java.io.tmpdir/ehcache"/> <!-- 默認緩存 --> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false"/> <!-- 菜單緩存 --> <cache name="menuCache" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" memoryStoreEvictionPolicy="LRU"/> </ehcache>
參數說明:線程
<diskStore>:當內存緩存中對象數量超過maxElementsInMemory時,將緩存對象寫到磁盤緩存中(需對象實現序列化接口)。code
<diskStore path="">:用來配置磁盤緩存使用的物理路徑,Ehcache磁盤緩存使用的文件後綴名是*.data和*.index。xml
name:緩存名稱,cache的惟一標識(ehcache會把這個cache放到HashMap裏)。對象
maxElementsOnDisk:磁盤緩存中最多能夠存放的元素數量,0表示無窮大。接口
maxElementsInMemory:內存緩存中最多能夠存放的元素數量,若放入Cache中的元素超過這個數值,則有如下兩種狀況。內存
1)若overflowToDisk=true,則會將Cache中多出的元素放入磁盤文件中。element
2)若overflowToDisk=false,則根據memoryStoreEvictionPolicy策略替換Cache中原有的元素。
Eternal:緩存中對象是否永久有效,便是否永駐內存,true時將忽略timeToIdleSeconds和timeToLiveSeconds。
timeToIdleSeconds:緩存數據在失效前的容許閒置時間(單位:秒),僅當eternal=false時使用,默認值是0表示可閒置時間無窮大,此爲可選屬性即訪問這個cache中元素的最大間隔時間,若超過這個時間沒有訪問此Cache中的某個元素,那麼此元素將被從Cache中清除。
timeToLiveSeconds:緩存數據在失效前的容許存活時間(單位:秒),僅當eternal=false時使用,默認值是0表示可存活時間無窮大,即Cache中的某元素從建立到清楚的生存時間,也就是說從建立開始計時,當超過這個時間時,此元素將從Cache中清除。
overflowToDisk:內存不足時,是否啓用磁盤緩存(即內存中對象數量達到maxElementsInMemory時,Ehcache會將對象寫到磁盤中),會根據標籤中path值查找對應的屬性值,寫入磁盤的文件會放在path文件夾下,文件的名稱是cache的名稱,後綴名是data。
diskPersistent:是否持久化磁盤緩存,當這個屬性的值爲true時,系統在初始化時會在磁盤中查找文件名爲cache名稱,後綴名爲index的文件,這個文件中存放了已經持久化在磁盤中的cache的index,找到後會把cache加載到內存,要想把cache真正持久化到磁盤,寫程序時注意執行net.sf.ehcache.Cache.put(Element element)後要調用flush()方法。
diskExpiryThreadIntervalSeconds:磁盤緩存的清理線程運行間隔,默認是120秒。
diskSpoolBufferSizeMB:設置DiskStore(磁盤緩存)的緩存區大小,默認是30MB
memoryStoreEvictionPolicy:內存存儲與釋放策略,即達到maxElementsInMemory限制時,Ehcache會根據指定策略清理內存,共有三種策略,分別爲LRU(最近最少使用)、LFU(最經常使用的)、FIFO(先進先出)。
2.service層使用中的參數說明
2.1 添加緩存
@Cacheable(value="menuCache",key="'UserMenuKey'+#userid") public List<MenuBean> queryMenuByUserId(String userid) { …… }
@Cacheable主要針對方法配置,可以根據方法的請求參數對其結果進行緩存。
@CachePut主要針對方法配置,可以根據方法的請求參數對其結果進行緩存,和 @Cacheable 不一樣的是,它每次都會觸發真實方法的調用。
2.2 清除緩存
@CacheEvict(value="menuCache",key="'UserMenuKey'+#userRoleBean.getUserId()") public boolean delUserRole(UserRoleBean userRoleBean) { …… }
@CachEvict主要針對方法配置,可以根據必定的條件對緩存進行清空。
3.ehcache將緩存內容存入硬盤
<diskStore path="C:/temp"/>
<cache name="authCache1"
maxElementsInMemory="36"
maxElementsOnDisk="10000"
overflowToDisk="true"
diskPersistent="true"
diskSpoolBufferSizeMB="20"
/>
當內存中的數據量超過了設置的最大記錄數maxElementsInMemory,則會將多餘的記錄數存入硬盤,可是內存中已經存在的內容則不會自動存入硬盤,須要手動使用cache.flush()來強制將內存內容放入硬盤中;
通常maxElementsOnDisk的值須要設置的比maxElementsInMemory大,這樣效率會高一些;
須要設置overflowToDisk爲true,表示使用硬盤緩存策略;
須要設置diskPersistent爲true,不然重啓服務後緩存文件會被清理掉,同時該屬性會在必定程度上拖慢緩存速度,由於它須要不停地監控設置的硬盤大小是否已滿關聯屬性爲diskSpoolBufferSizeMB,若是硬盤夠大能夠將該屬性設置足夠大;
最後 會生成*.index和*.data2個文件;
*重建緩存會自動從硬盤讀取數據到內存