經過spring大佬的整合,ehcache2使用起來非常簡單。
一、以下屬性是必須的:
1、name: cache的名稱,必須是唯一的(ehcache會把這個cache放到hashmap裡)。
2、maxelementsinmemory:在記憶體中快取的element的最大數目。
3、maxelementsondisk:在磁碟上快取的element的最大數目,預設值為0,表示不限制。
4、eternal:設定快取的elements是否永遠不過期。如果為true,則快取的資料始終有效,如果為false那麼還要根據timetoidleseconds,timetoliveseconds判斷。
5、overflowtodisk: 如果記憶體中資料超過記憶體限制,是否要快取到磁碟上。
二、以下屬性是可選的:
1、timetoidleseconds: 物件空閒時間,指物件在多長時間沒有被訪問就會失效。只對eternal為false的有效。預設值0,表示一直可以訪問。
2、timetoliveseconds: 物件存活時間,指物件從建立到失效所需要的時間。只對eternal為false的有效。預設值0,表示一直可以訪問。
3、diskpersistent: 是否在磁碟上持久化。指重啟jvm後,資料是否有效。預設為false。
4、diskexpirythreadintervalseconds: 物件檢測線程執行時間間隔。標識物件狀態的執行緒多長時間執行一次。
5、diskspoolbuffersizemb: diskstore使用的磁碟大小,預設值30mb。每個cache使用各自的diskstore。
6、memorystoreevictionpolicy: 如果記憶體中資料超過記憶體限制,向磁碟快取時的策略。預設值lru,可選fifo、lfu。
四、快取的3 種清空策略 :
1、fifo ,first in first out (先進先出).
2、lfu , less frequently used (最少使用).意思是一直以來最少被使用的。快取的元素有乙個hit 屬性,hit 值最小的將會被清出快取。
3、lru ,least recently used(最近最少使用). (ehcache 預設值).快取的元素有乙個時間戳,當快取容量滿了,而又需要騰出地方來快取新的元素的時候,那麼現有快取元素中時間戳離當前時間最遠的元素將被清出快取。
1、ehcache2 xml配置檔案
diskpersistent設定為true,即使服務重啟,經測試快取依然儲存。
<?xml version="1.0" encoding="utf-8"?>
2、spring中引入ehcache 和配置檔案
注意頭部引入資訊需加入: xmlns:cache=""
3、通過註解使用快取
注意,只有被spring管理的bean,註解才會生效。 spring生成bean時根據註解生成了**物件,將快取**加入其中。
//將id 和返回資訊以鍵值對 存入快取
@cacheable(value="mycache",key="#id")
public string getuser(int id)
//移除快取
@cacheevict(value="mycache",key="#id")
public void deleteuser(int id)
1.@cacheable
可以標記在乙個方法上,也可以標記在乙個類上。當標記在乙個方法上時表示該方法是支援快取的,當標記在乙個類上時則表示該類所有的方法都是支援快取的。對於乙個支援快取的方法,spring會在其被呼叫後將其返回值快取起來,以保證下次利用同樣的引數來執行該方法時可以直接從快取中獲取結果,而不需要再次執行該方法。spring在快取方法的返回值時是以鍵值對進行快取的,值就是方法的返回結果,至於鍵的話,spring又支援兩種策略,預設策略和自定義策略。
需要注意的是當乙個支援快取的方法在物件內部被呼叫時是不會觸發快取功能的。@cacheable可以指定三個屬性,value、key和condition。
2.@cacheput
在支援spring cache的環境下,對於使用@cacheable標註的方法,spring在每次執行前都會檢查cache中是否存在相同key的快取元素,如果存在就不再執行該方法,而是直接從快取中獲取結果進行返回,否則才會執行並將返回結果存入指定的快取中。而@cacheput也可以宣告乙個方法支援快取功能。與@cacheable不同的是使用@cacheput標註的方法在執行前不會去檢查快取中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的快取中。
@cacheput也可以標註在類上和方法上。使用@cacheput時我們可以指定的屬性跟@cacheable是一樣的。
3.@cacheevict
@cacheevict是用來標註在需要清除快取元素的方法或類上的。當標記在乙個類上時表示其中所有的方法的執行都會觸發快取的清除操作。@cacheevict可以指定的屬性有value、key、condition、allentries和beforeinvocation。其中value、key和condition的語義與@cacheable對應的屬性類似。即value表示清除操作是發生在哪些cache上的(對應cache的名稱);key表示需要清除的是哪個key,如未指定則會使用預設策略生成的key;condition表示清除操作發生的條件。
屬性一:value
必須指定的,其表示當前方法的返回值是會被快取在哪個cache上的,對應cache的名稱,為ehcache.xml中的。其可以是乙個cache也可以是多個cache,當需要指定多個cache時其是乙個陣列。
屬性二:key
快取的key,當我們沒有指定該屬性時,spring將使用預設策略生成key(表示使用方法的引數型別及引數值作為key),key屬性是用來指定spring快取方法的返回結果時對應的key的。該屬性支援springel表示式。我們還可以自定義策略:自定義策略是指我們可以通過spring的el表示式來指定我們的key。這裡的el表示式可以使用方法引數及它們對應的屬性。使用方法引數時我們可以直接使用「#引數名」或者「#p引數index」
key的生成策略有兩種:一種是預設策略,一種是自定義策略
¹預設的key生成策略是通過keygenerator生成的,其預設策略如下:
1.如果方法沒有引數,則使用0作為key。
2.如果只有乙個引數的話則使用該引數作為key。
3.如果引數多餘乙個的話則使用所有引數的hashcode作為key
²自定義策略是指我們可以通過spring的el表示式來指定我們的key。這裡的el表示式可以使用方法引數及它們對應的屬性。使用方法引數時我們可以直接使用「#引數名」或者「#p引數index
屬性三:condition
有的時候我們可能並不希望快取乙個方法所有的返回結果。通過condition屬性可以實現這一功能。
condition屬性預設為空,表示將快取所有的呼叫情形。其值是通過springel表示式來指定的,當為true時表示進行快取處理;當為false時表示不進行快取處理,即每次呼叫該方法時該方法都會執行一次。如下示例表示只有當user的id為偶數時才會進行快取
@cacheable(value=, key="#user.id", condition="#user.id%2==0")
public user find(user user)
屬性四:allentries
是boolean型別,表示是否需要清除快取中的所有元素。預設為false,表示不需要。當指定了allentries為true時,spring cache將忽略指定的key。有的時候我們需要cache一下清除所有的元素,這比乙個乙個清除元素更有效率。
@cacheevict(value="users", allentries=true)
public void delete(integer id)
屬性五:beforeinvocation
清除操作預設是在對應方法成功執行之後觸發的,即方法如果因為丟擲異常而未能成功返回時也不會觸發清除操作。使用beforeinvocation可以改變觸發清除操作的時間,當我們指定該屬性值為true時,spring會在呼叫該方法之前清除快取中的指定元素。
@cacheevict(value="users", beforeinvocation=true)
public void delete(integer id)
Ehcache快取配置
cache配置 name cache的唯一標識 maxelementsinmemory 記憶體中最大快取物件數。maxelementsondisk 磁碟中最大快取物件數,若是0表示無窮大。eternal element是否永久有效,一但設定了,timeout將不起作用。overflowtodisk ...
ehcache 快取使用
一 詳細配置步驟 1,新增ehcache.xml檔案 將ehcache.xml檔案新增到src路徑下面。ehcache.xml檔案內容如下 2,新增spring配置檔案 二 使用 1,定義ehcache工具方法 public class ehcache public cache getcache p...
Ehcache快取模式
ehcache快取模式 簡介 快取有多種不同的快取模式。以下是ehcache支援的快取模式 直接操作 direct manipulation 推送模式 pull through 自填充 self populating 直接操作 direct manipulation 你可以通過方法cache.put...