Spring – 緩衝抽象

來源:互聯網
上載者:User
Spring緩衝抽象概述

Spring架構自身並沒有實現緩衝解決方案,但是從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager介面,提供對緩衝功能的聲明,能夠與多種流行的緩衝實現整合。

Cache介面為緩衝的組件規範定義,包含緩衝的各種操作集合;

Cache介面下Spring提供了各種xxxCache的實現:如RedisCache,EhCacheCache , ConcurrentMapCache等;

CacheManager介面為緩衝管理器規範,簡單來說就是用於存放cache,Spring預設也提供了一些列管理器的實現。

Spring緩衝抽象提供了5個註解用來聲明緩衝規則:

@Cacheable:能夠根據方法的請求參數對其結果進行緩衝,多用於查詢

@CachePut: 執行方法,並緩衝結果

@CacheEvict:清空緩衝

@Caching:能夠同時應用多個緩衝註解功能

@CacheConfig: 用於抽取緩衝的公用配置(類層級)

以上5個註解除了@CacheConfig註解是類層級的註解,其餘4個註解在類和方法上均可以使用,作用在類上表示對該類下所有方法生效,作用的方法上只對該方法生效,且只能用於public修飾的符方法,protected或者private修飾的方法不適用。

@Cacheable註解

@Cacheable註解的作用是Spring在調用該方法之前,首先在緩衝中尋找方法的傳回值,預設的key是根據參數值產生,如果存在,直接返回緩衝中的值,否則執行該方法,並將傳回值儲存到緩衝中

@Cacheable運行流程:

  1.方法運行之前,先去查詢Cache(緩衝組件),按照cacheNames指定的名字擷取;

           (CacheManager先擷取相應的緩衝),第一次擷取緩衝如果沒有Cache組件會自動建立。

  2.去Cache中尋找緩衝的內容,使用一個key,預設就是方法的參數值;

           key是按照某種策略產生的;預設是使用keyGenerator產生的,               

     Spring預設載入的是SimpleCacheManage,SimpleKeyGenerator產生key的預設策略是:

                       如果沒有參數;key=new SimpleKey()

                       如果有一個參數:key=參數的值

                       如果有多個參數:key=new SimpleKey(params)

  3.沒有查到緩衝就調用目標方法;

  4.將目標方法返回的結果,放進緩衝中

@Cacheable屬性說明:

  1.acheNames/value:該屬性值必須提供,指定緩衝組件的名字,將方法的返回結果放在哪個緩衝中,是數組的方式,可以指定多個緩衝;

      如:cacheNames = "product"或者cacheNames = {"product1","product2"}

  2.key:快取資料使用的key,不指定key則預設是使用方法參數的值該屬性值支援SpEL運算式

       3.cacheManager:指定緩衝管理器;或者cacheResolver指定擷取解析器

       4.condition:指定合格情況下才緩衝

  5.unless:否定緩衝;當unless指定的條件為true,方法的傳回值就不會被緩衝;可以擷取到結果進行判斷

                  unless = "#result == null"

                   unless = "#a0==2":如果第一個參數的值是2,結果不緩衝;

  6.sync:是否使用非同步模式

使用樣本:

 1 @Cacheable(cacheNames = "product")// 預設key為參數,多個參數SimpleKey [arg1,arg2] 2 //@Cacheable(cacheNames = "product",key = "#root.methodName+'['+#id+']'") 3 //@Cacheable(cacheNames = "product",keyGenerator = "myKeyGenerator") 4 //@Cacheable(cacheNames = "product",key = "#root.methodName+'['+#id+']'",condition="#a0>10",unless = "#a0==11") //帶條件的緩衝滿足condition=true緩衝,滿足unless=true則不緩衝  5 public Product getProductById(Long id){ 6    Product product =productMapper.getProductById(id); 7    System.out.println(product); 8    return product; 9 }
10 //指定key屬性值11 @Cacheable(cacheNames ="product", key="#id") //”#+參數名”的形式,直接使用參數名12 //或者13 //@Cacheable(cacheNames ="product", key="#a0") //”#a+參數位置”的形式14 public Product getProductById(long id) {15 xxxx16 }17 @Cacheable(cacheNames ="product", key="# productcondition.productId") 18 //或者19 //@Cacheable(cacheNames ="product", key="#a0.productId") 20 public Product getProduct (Product productcondition) {21 xxxx22 }
自訂Key產生器

除了通過SPEL運算式之外,還可以通過自訂key產生器的方式,Spring緩衝模組提供了org.springframework.cache.interceptor.KeyGenerator介面用於緩衝key的產生聲明,因此我們可以自訂一個MyKeyGenerator類並實現了KeyGenerator介面 ,使用如下:

 1 @Configuration 2 public class MyCacheConfig { 3  4     @Bean("myKeyGenerator") 5     public KeyGenerator keyGenerator(){ 6         return new KeyGenerator(){ 7  8             @Override 9             public Object generate(Object target, Method method, Object... params) {10                 return method.getName()+"["+ Arrays.asList(params).toString()+"]";11             }12         };13     }14 }

該方法測試用,關於緩衝key的產生方式,網上有很多種策略。

使用時只需要修改註解的key屬性即可:

1 @Cacheable(cacheNames = "product",keyGenerator = "myKeyGenerator")
  @CachePut

@CachePut註解的作用簡單的說一句話:既調用方法,又快取資料。@cachePut和@Cacheable兩個註解都可以用於填充緩衝,但使用上略有點差異,@Cacheable註解的執行流程是先在按key在緩衝中尋找,存在則返回,不存在則執行目標方法,並緩衝目標方法的結果。而@CachePut並不會檢查緩衝,總是先執行目標方法,並將目標方法的結果儲存到緩衝中。實際中比如執行到更新操作時,則希望將最新的資料更新到緩衝,如果該方法返回異常,將不再執行儲存緩衝的邏輯。

@CachePut屬性說明

@CachePut註解屬性與@CachePut類似,並沒有增加其他屬性

使用樣本:

 1 @CachePut(value="product",key = "#result.productId",condition = "#result!=null") 2 public  Product updateProduct(Product product){ 3     int count = productMapper.updateProduct(product); 4     System.out.println("影響行數:"+count); 5     if(count>0){ 6         return product; 7     }else{ 8         return null; 9     }10 }
@CacheEvict註解

該註解的作用根據指定的key或者是allEntries屬性值移除緩衝中特性的索引值對。

@CacheEvict屬性說明

與@Cacheable相比@CacheEvict註解提供了另外兩個屬性:

  1. allEntries:表示是否清空所有緩衝內容,預設false,如果該值為true則清空指定cacheNames緩衝塊下所有內容,如果指定了allEntries為true,那麼再zhidingkey值將沒有意義

  2. beforeInvocation:是否在執行方法前請空緩衝,預設值為false,如果該值為true則在調用目標方法前執行清空緩衝,為false的情況下,如果目標方法拋出異常,則不再執行清空緩衝邏輯

樣本:

1 //@CacheEvict(value="product",key="#id")2 //@CacheEvict(value="product",allEntries = true) //清楚所有緩衝3 @CacheEvict(value="product",allEntries = true,beforeInvocation = true) //清楚所有緩衝4 public boolean deleteProductById(Long id) {5     productMapper.deleteProductById(id);6     return true;7 }
@Caching註解

該註解是一個分組註解,作用是可以同時應用多個其他註解,該註解提供了3個屬性cacheable,put,evict分別用於組合@Cacheable、@CachePut、@CacheEvict三個註解

使用樣本:

 1 @Caching( 2         cacheable = {@Cacheable(value="product",key="#productName")}, 3         put = { 4                 @CachePut(value="product",key="#result.productId"), 5                 @CachePut(value="product",key="#result.productName") 6         } 7 ) 8 public  Product getProductByName(String productName){ 9 10     Product product =productMapper.getProductByName(productName);11 12      return product;13 }

當@Cacheing同時含有CachePut註解和Cacheable註解時,仍然會先執行目標方法。(並不是按@Cacheable的執行過程,先檢查緩衝,存在則返回)

@CacheConfig

是一個類層級的註解,允許共用快取的名稱、KeyGenerator、CacheManager 和CacheResolver

樣本:

1 @Service2 @CacheConfig(cacheNames = "product")3 public class ProductService {4 }

在類上使用該註解,指定cacheNames屬性值,則類中方法上的註解將預設繼承了該屬性值,如果方法上註解使用和了@CacheConfig向同的屬性,則以方法上的為準。

 1 @Service 2 @CacheConfig(cacheNames = "product") 3 public class ProductService { 4     @Autowired 5     private ProductMapper productMapper; 6  7     @Cacheable(cacheNames = "product1",key = "#root.methodName+'['+#id+']'") 8     public Product getProductById(Long id){ 9        Product product =productMapper.getProductById(id);10        System.out.println(product);11        return product;12     }13 }

上面@Cacheable和@CacheConfig都指定了屬性值cacaeNames,實際以方法上註解指定的為準。

 

Spring緩衝抽象的關鍵原理就是使用spring AOP,通過切面實現了在方法調用前、調用後擷取方法的入參和傳回值,進而實現了緩衝的邏輯。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.