天天看點

使用Simple-Spring-Memcached注解做緩存操作 使用Simple-Spring-Memcached注解做緩存操作

使用Simple-Spring-Memcached注解做緩存操作

2014-06-10 15:16  4798人閱讀  評論(0)  收藏  舉報

使用Simple-Spring-Memcached注解做緩存操作 使用Simple-Spring-Memcached注解做緩存操作

  分類:   memcache(14) 

使用Simple-Spring-Memcached注解做緩存操作 使用Simple-Spring-Memcached注解做緩存操作

 之前自己寫過一個通過注解和AOP來實作緩存的代碼,當時這段代碼寫得比較簡單,之後重構時發現之前的功能實作有很大的局限。主要問題在于:

  1. key的生成規則
  2. update 與 query 的參數不一樣,如何讓其生成一樣的key
  3. 清單緩存如何定義key及失效

最近同僚推薦了一個開源項目:Simple-Spring-Memcached,它也是一個通過Annatation與AOP來完成緩存資料操作的開源項目。仔細看了一下代碼,基本上把我之前碰到的問題都解決了,而且MultiCache這一塊的實作超出我的預期。該項目主要優點如下:

  1. 與Spring完善內建
  2. 支援兩種Memcached Java Client (spymemcached,Xmemcached)
  3. 基于Annotation方式實作緩存操作,對代碼侵入性小
  4. annotation豐富,可以滿足絕大部分需求

下面介紹一下其中各annotation的使用。ssm項目中的Annotation主要分成以下幾類

  • SingleCache類 操作單個POJO的Cache資料,由ParameterValueKeyProvider和CacheKeyMethod來辨別組裝key
  • MultiCache類 操作List型的Cache資料,由ParameterValueKeyProvider和CacheKeyMethod來辨別組裝key
  • AssignCache類 指定key操作Cache資料,由annotation中的 assignedKey 指定key

各Annotation的詳細說明

  • ReadThroughSingleCache

    作用:讀取Cache中資料,如果不存在,則将讀取的資料存入Cache

    key生成規則:ParameterValueKeyProvider指定的參數,如果該參數對象中包含CacheKeyMethod注解的方法,則調用其方法,否則調用toString方法

    代碼示例:

  • [java]  view plain copy print ?
    1. @ReadThroughSingleCache(namespace = "Alpha", expiration = 30)  
    2.     public String getDateString(@ParameterValueKeyProvider final String key) {  
    3.         final Date now = new Date();  
    4.         try {  
    5.             Thread.sleep(1500);  
    6.         } catch (InterruptedException ex) {  
    7.         }  
    8.         return now.toString() + ":" + now.getTime();  
    9.     }  

    InvalidateSingleCache

    作用:失效Cache中的資料

    key生成規則:

    • 使用 ParameterValueKeyProvider注解時,與ReadThroughSingleCache一緻
    • 使用 ReturnValueKeyProvider 注解時,key為傳回的對象的CacheKeyMethod或toString方法生成
    [java]  view plain copy print ?
    1. @InvalidateSingleCache(namespace = "Charlie")  
    2.     public void updateRandomString(@ParameterValueKeyProvider final Long key) {  
    3.         // Nothing really to do here.  
    4.     }  
    5.     @InvalidateSingleCache(namespace = "Charlie")  
    6.     @ReturnValueKeyProvider  
    7.     public Long updateRandomStringAgain(final Long key) {  
    8.         return key;  
    9.     }  

    UpdateSingleCache

    作用:更新Cache中的資料

    key生成規則:ParameterValueKeyProvider指定

    ParameterDataUpdateContent:方法參數中的資料,作為更新緩存的資料

    ReturnDataUpdateContent:方法調用後生成的資料,作為更新緩存的資料

    注:上述兩個注解,必須與Update*系列的注解一起使用

[java]  view plain copy print ?

  1. @UpdateSingleCache(namespace = "Alpha", expiration = 30)  
  2.     public void overrideDateString(final int trash, @ParameterValueKeyProvider final String key,  
  3.             @ParameterDataUpdateContent final String overrideData) {  
  4.     }  
  5.     @UpdateSingleCache(namespace = "Bravo", expiration = 300)  
  6.     @ReturnDataUpdateContent  
  7.     public String updateTimestampValue(@ParameterValueKeyProvider final Long key) {  
  8.         try {  
  9.             Thread.sleep(100);  
  10.         } catch (InterruptedException ex) {  
  11.         }  
  12.         final Long now = new Date().getTime();  
  13.         final String result = now.toString() + "-U-" + key.toString();  
  14.         return result;  
  15.     }  

ReadThroughAssignCache

作用:讀取Cache中資料,如果不存在,則将讀取的資料存入Cache

key生成規則: ReadThroughAssignCache 注解中的 assignedKey 字段指定

[java] 
      view plain
      copy
      print
      ?
      
      
     
    
            
  1. @ReadThroughAssignCache(assignedKey = "SomePhatKey", namespace = "Echo", expiration = 3000)  
  2.     public List<String> getAssignStrings() {  
  3.         try {  
  4.             Thread.sleep(500);  
  5.         } catch (InterruptedException ex) {  
  6.         }  
  7.         final List<String> results = new ArrayList<String>();  
  8.         final long extra = System.currentTimeMillis() % 20;  
  9.         final String base = System.currentTimeMillis() + "";  
  10.         for (int ix = 0; ix < 20 + extra; ix++) {  
  11.             results.add(ix + "-" + base);  
  12.         }  
  13.         return results;  
  14.     }  
InvalidateAssignCache 作用:失效緩存中指定key的資料 key生成規則:assignedKey 字段指定
@InvalidateAssignCache(assignedKey = "SomePhatKey", namespace = "Echo")
    public void invalidateAssignStrings() {
    }      
UpdateAssignCache 作用:更新指定緩存 key生成規則:assignedKey 字段指定
@UpdateAssignCache(assignedKey = "SomePhatKey", namespace = "Echo", expiration = 3000)
    public void updateAssignStrings(int bubpkus, @ParameterDataUpdateContent final List<String> newData) {
    }