使用@Cacheable 踩過的坑


public class XXX{
    
@Resource
private XXX self;//@Cacheable通過內部調用將不會使用緩存,從Spring4.3開始可以通過注入self,再通過self內部調用即可解決
public final static String MY_KEY="my_key:";

@Cacheable(value=MY_KEY, key = "#root.target.getFormatKey(#p0,#p1)", unless="#result == null")//自定義key名稱,查詢結果為空則不緩存
public xXXEntity select(Date date,String str) {
return xXXdao.select(date, str);
}

public String getFormatKey(Date date,String str){//生成key
return DateUtils.getFormat(date)+sourceKey;//格式化時間拼接key
}
public Integer selectValue(Date date,String str) {
  xXXEntity entity = self.select(date, str);//解決內部調用不觸發緩存的問題
    if(entity!=null){
return entity.getValue();
}
return 0;
}


}

1.解析:
value=MY_KEY -->redisz緩存中的key
生成redis中hash的key = "#root.target.getFormatKey(#p0,#p1)"  -->當前調用對象中的方法,傳入第一個和第二個參數
unless="#result == null" -->查詢結果為空則不緩存(不加上會緩存一個空對象,拿值就悲劇了)




2.內部調用不觸發緩存
方法一:https://www.cnblogs.com/cyhbyw/p/8615816.html 侵刪

方法二(推薦):https://stackoverflow.com/questions/16899604/spring-cache-cacheable-not-working-while-calling-from-another-method-of-the-s/48867068#48867068
 代碼中有提現,思路:注入自己,然后通過注入的實例調用自己的方法來觸發緩存機制.

@Resource
private XXX self;//@Cacheable通過內部調用將不會使用緩存,從Spring4.3開始可以通過注入self,再通過self內部調用即可解決
 
        
@Cacheable(value=MY_KEY, key = "#root.target.getFormatKey(#p0,#p1)", unless="#result == null")//自定義key名稱,查詢結果為空則不緩存
public xXXEntity select(Date date,String str) {
return xXXdao.select(date, str);
}
public Integer selectValue(Date date,String str) {
  xXXEntity entity = self.select(date, str);//解決內部調用不觸發緩存的問題
    if(entity!=null){
return entity.getValue();
}
return 0;
}

  
}
 


免責聲明!

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



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