springboot緩存注解——@Cacheable


@Cacheable:
1,方法運行之前,先查詢Cache(緩存組件),按照cacheName指定的名字獲取(CacheManager獲取相應緩存)
     第一次獲取緩存如果沒有Cache組件會自會自動創建
2,去Cache中查找緩存的內容,使用一個key默認是方法的參數;
    key是按照某種策略生成的,默認是使用keyGenerator生成的,默認使用SimpleKeyGenerator生成key
            SimpleKeyGenerator生成策略:
                       如果沒有參數:key=new  Simlekey()
                       如果有一個參數:key=參數的值
                       如果有多個參數:key=new Simplekey(params)
3,沒有查到緩存就調用目標方法
4,講目標方法返回的結果放進緩存


核心:
  1,使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】組件
  2,key使用keyGenerator生成的,默認的是SimpleKeyGenerator
  3,緩存運行步驟
幾個屬性:

cacheNames/values:指定緩存組件的名字,將方法的返回結果放在哪個緩存中,是數組的方式,可以指定多個緩存

key:緩存數據使用的key;可以用它來指定。默認是使用方法參數的值   
         可以用spEL表達式來表示;#id-如(getEmp[1]); 參數id的值:  #a0  #p0  #root.args[0]

keyGenerator:key的生成器;可以自己指定key的生成器的組件id
                       key/keyGenerator:二選一使用(自己配置類)

cacheManager:指定使用哪個緩存管理器;或者cacheResolver指定獲取解析器 

condition:指定符合條件的情況下才緩存; 如:condition = "#a0>1"  即第一個參數值大於1時才進行緩存

unless:否定緩存;當unless指定的條件為true,方法的返回值就不會被緩存;可以獲取到的結果進行判斷
            如: unless = “#a0”:如果第一個參數值是2,則結果不緩存
unless = “#result == null” 結果為null不緩存

結合寫法:
@Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator",condition = "#a0>1",unless =  "#a0==2")  
意思為 放在的緩存名稱為emp中,key的生成方式為配置的myKeyGenerator類,當第一個參數大於1時候緩存,當第一個參數等於2時不緩存
sync:是否使用異步模式(異步模式情況下unless不支持)


key的生成方式
  • 直接在注解中聲明:
    //@Cacheable(cacheNames = {"emp"},key = "#root.methodName+'['+#id+']'")
     public Employee getEmp(Integer id){
            System.out.println("查詢"+id+"號員工");
            Employee emp =  employeeMapper.getEmpById(id);
            return  emp;
        }
    
    此時當id為1時,key的值為 getEmp[1]

    附上spEL表達式表

  • 編寫自己的KeyGenerator配置類
    @Configuration
    public class MyCacheConfig {
    
        @Bean("myKeyGenerator")
        public KeyGenerator keyGenerator (){
          return   new KeyGenerator(){
                @Override
                public Object generate(Object o, Method method, Object... objects) {
                    return method.getName()+"["+ Arrays.asList(objects).toString()+"]";
                }
            };
        };
    }
    這里返回的key的值為getEmp[[1]]

     

    總結:@Cacheable標注的方法執行之前先來檢查緩存中有沒有這個數據,默認按照參數的值作為key去查詢緩存,如果沒有就運行方法並將結果放入緩存;以后再來調用就可以直接使用緩存中的數據 

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM