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;
}
}