1. 程式人生 > >spring集成ehcache本地緩存

spring集成ehcache本地緩存

方法 original play 類型 ssp delet 屬性。 獲取 spa

1.maven依賴

技術分享圖片
       <!-- ehcache 相關依賴  -->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.8.2</version>
        </dependency>
ehcache

2.配置ecache.xml配置

技術分享圖片
<ehcache 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <!-- name:緩存名稱。 maxElementsInMemory:緩存最大數目 maxElementsOnDisk:硬盤最大緩存個數。 eternal:對象是否永久有效,一但設置了,timeout將不起作用。 overflowToDisk:是否保存到磁盤,當系統當機時 timeToIdleSeconds:設置對象在失效前的允許閑置時間(單位:秒)。僅當eternal=false對象不是永久有效時使 用,可選屬性,默認值是0,也就是可閑置時間無窮大。 timeToLiveSeconds:設置對象在失效前允許存活時間(單位:秒)。最大時間介於創建時間和失效時間之間。僅 當eternal=false對象不是永久有效時使用,默認是0.,也就是對象存活時間無窮大。 diskPersistent:是否緩存虛擬機重啟期數據Whether the disk store persists between restarts of the Virtual Machine. The default value is false. diskSpoolBufferSizeMB:這個參數設置DiskStore(磁盤緩存)的緩存區大小。默認是30MB。每個Cache都應該 有自己的一個緩沖區。 diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認是120秒。 memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理內 存。默認策略是LRU(最近最少使用)。 你可以設置為FIFO(先進先出)或是LFU(較少使用)。 clearOnFlush:內存數量最大時是否清除。 memoryStoreEvictionPolicy:可選策略有:LRU(最近最少使用,默認策略)、FIFO(先進先出)、LFU(最少 訪問次數)。 FIFO,first in first out,這個是大家最熟的,先進先出。 LFU, Less Frequently Used,就是上面例子中使用的策略,直白一點就是講一直以來最少被使用的。如上面 所講,緩存的元素有一個hit屬性,hit值最小的將會被清出緩存。 LRU,Least Recently Used,最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地 方來緩存新的元素的時候, 那麽現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。
--> <cache name="testInfo" eternal="false" maxElementsInMemory="300" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU"/> </ehcache>
ecache.xml

3.在spring容器集成ecache

<!-- ehcache配置 -->
<!--聲明一個緩存管理器(EhCacheCacheManager) 這裏的實現代碼是通過傳入EhCache的CacheManager實例實現的 -->
<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">
<!-- 指定 ehcache配置文件路徑-->
<property name="cacheManager" ref="ehcache" />
</bean>
<!--啟用註解驅動緩存 -->
<cache:annotation-driven cache-manager="cacheManager" />

註意cache標簽

4.spring的註解

其實EhCache使用的就是Spring Cache的註解。

1.1 @Cacheable
@Cacheable可以標記在一個方法上,也可以標記在一個類上。當標記在一個方法上時表示該方法是支持緩存的,當標記在一個類上時則表示該類所有的方法都是支持緩存的。對於一個支持緩存的方法,Spring會在其被調用後將其返回值緩存起來,以保證下次利用同樣的參數來執行該方法時可以直接從緩存中獲取結果,而不需要再次執行該方法。Spring在緩存方法的返回值時是以鍵值對進行緩存的,值就是方法的返回結果,至於鍵的話,Spring又支持兩種策略,默認策略和自定義策略,這個稍後會進行說明。需要註意的是當一個支持緩存的方法在對象內部被調用時是不會觸發緩存功能的。@Cacheable可以指定三個屬性,value、key和condition。

1.1.1 value屬性指定Cache名稱
value屬性是必須指定的,其表示當前方法的返回值是會被緩存在哪個Cache上的,對應Cache的名稱。其可以是一個Cache也可以是多個Cache,當需要指定多個Cache時其是一個數組。

   @Cacheable("cache1")//Cache是發生在cache1上的
   public User find(Integer id) {
      return null;
   }
 
   @Cacheable({"cache1", "cache2"})//Cache是發生在cache1和cache2上的
   public User find(Integer id) {
      return null;
   }

1.1.2 使用key屬性自定義key
key屬性是用來指定Spring緩存方法的返回結果時對應的key的。該屬性支持SpringEL表達式。當我們沒有指定該屬性時,Spring將使用默認策略生成key。我們這裏先來看看自定義策略,至於默認策略會在後文單獨介紹。
自定義策略是指我們可以通過Spring的EL表達式來指定我們的key。這裏的EL表達式可以使用方法參數及它們對應的屬性。使用方法參數時我們可以直接使用“#參數名”或者“#p參數index”。下面是幾個使用參數作為key的示例。

  @Cacheable(value="users", key="#id")
  public User find(Integer id) {
     return null;
  }

  @Cacheable(value="users", key="#p0")
  public User find(Integer id) {
     return null;
  }

  @Cacheable(value="users", key="#user.id")
  public User find(User user) {
     return null;
  }

  @Cacheable(value="users", key="#p0.id")
  public User find(User user) {
     return null;
  }

除了上述使用方法參數作為key之外,Spring還為我們提供了一個root對象可以用來生成key。通過該root對象我們可以獲取到以下信息。

技術分享圖片 Paste_Image.png

當我們要使用root對象的屬性作為key時我們也可以將“#root”省略,因為Spring默認使用的就是root對象的屬性。如:

  @Cacheable(value={"users", "xxx"}, key="caches[1].name")
  public User find(User user) {
        return null;
  }

1.1.3 condition屬性指定發生的條件
有的時候我們可能並不希望緩存一個方法所有的返回結果。通過condition屬性可以實現這一功能。condition屬性默認為空,表示將緩存所有的調用情形。其值是通過SpringEL表達式來指定的,當為true時表示進行緩存處理;當為false時表示不進行緩存處理,即每次調用該方法時該方法都會執行一次。如下示例表示只有當user的id為偶數時才會進行緩存。

  @Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
  public User find(User user) {
     System.out.println("find user by user " + user);
     return user;
  }

1.2 @CachePut
在支持Spring Cache的環境下,對於使用@Cacheable標註的方法,Spring在每次執行前都會檢查Cache中是否存在相同key的緩存元素,如果存在就不再執行該方法,而是直接從緩存中獲取結果進行返回,否則才會執行並將返回結果存入指定的緩存中。
@CachePut也可以聲明一個方法支持緩存功能。與@Cacheable不同的是使用@CachePut標註的方法在執行前不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果(返回值)以鍵值對的形式存入指定的緩存中。所以必須有返回值,沒有返回值則不會放入新的緩存。
@CachePut也可以標註在類上和方法上。使用@CachePut時我們可以指定的屬性跟@Cacheable是一樣的。

  @CachePut("users")//每次都會執行方法,並將結果存入指定的緩存中
  public User find(Integer id) {
     return user;
  }

1.3 @CacheEvict
@CacheEvict是用來標註在需要清除緩存元素的方法或類上的。當標記在一個類上時表示其中所有的方法的執行都會觸發緩存的清除操作。@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的語義與@Cacheable對應的屬性類似。即value表示清除操作是發生在哪些Cache上的(對應Cache的名稱);key表示需要清除的是哪個key,如未指定則會使用默認策略生成的key;condition表示清除操作發生的條件。下面我們來介紹一下新出現的兩個屬性allEntries和beforeInvocation。
1.3.1 allEntries屬性
allEntries是boolean類型,表示是否需要清除緩存中的所有元素。默認為false,表示不需要。當指定了allEntries為true時,Spring Cache將忽略指定的key。有的時候我們需要Cache一下清除所有的元素,這比一個一個清除元素更有效率。

  @CacheEvict(value="users", allEntries=true)
  public void delete(Integer id) {
     System.out.println("delete user by id: " + id);
  }

1.3.2 beforeInvocation屬性
清除操作默認是在對應方法成功執行之後觸發的,即方法如果因為拋出異常而未能成功返回時也不會觸發清除操作。使用beforeInvocation可以改變觸發清除操作的時間,當我們指定該屬性值為true時,Spring會在調用該方法之前清除緩存中的指定元素。

  @CacheEvict(value="users", beforeInvocation=true)
  public void delete(Integer id) {
     System.out.println("delete user by id: " + id);
  }

其實除了使用@CacheEvict清除緩存元素外,當我們使用Ehcache作為實現時,我們也可以配置Ehcache自身的驅除策略,其是通過Ehcache的配置文件來指定的。
1.4 @Caching
@Caching註解可以讓我們在一個方法或者類上同時指定多個Spring Cache相關的註解。其擁有三個屬性:cacheable、put和evict,分別用於指定@Cacheable、@CachePut和@CacheEvict。

   @Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),
         @CacheEvict(value = "cache3", allEntries = **true**) })
   **public** User find(Integer id) {
      **return****null**;
   }

3.1 Key的默認策略
默認的key生成策略是通過KeyGenerator生成的,其默認策略如下:

  • 如果方法沒有參數,則使用0作為key。
  • 如果只有一個參數的話則使用該參數作為key。
  • 如果參數多余一個的話則使用所有參數的hashCode作為key。

如果我們需要指定自己的默認策略的話,那麽我們可以實現自己的KeyGenerator,然後指定我們的Spring Cache使用的KeyGenerator為我們自己定義的KeyGenerator。
使用基於註解的配置時是通過cache:annotation-driven指定的.

   <cache:annotation-driven key-generator=*"userKeyGenerator"*/>
  
   <bean id="userKeyGenerator" class="com.xxx.cache.UserKeyGenerator"/>

而使用基於XML配置時是通過cache:advice來指定的。

   <cache:advice id="cacheAdvice" cache-manager="cacheManager" key-generator="userKeyGenerator">
   </cache:advice>

要點:
其實EhCache使用的就是Spring Cache的註解,需要註意的是當一個支持緩存的方法在對象內部被調用時是不會觸發緩存功能的。
@Cacheable參數:value指被緩存在哪個Cache上,key指緩存方法的返回結果對應的key,condition指什麽情況下緩存。
@Cacheable如果在緩存中發現相同的key則會從緩存中取數據。@CachePut每次都會重新執行,然後將結果放入緩存。@CacheEvict表示清除緩存。
如果沒有指定key。這是用Key的默認策略是(使用參數),也可以自定義key的生成策略。



作者:bluebule
鏈接:https://www.jianshu.com/p/db110523a387
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

spring集成ehcache本地緩存