在service層配置緩存
@CacheConfig
@CacheConfig(cacheNames="emp"/*,cacheManager = "employeeCacheManager"*/) //抽取緩存的公共配置查詢:
@Cacheable
@Cacheable標註的方法執行之前先來檢查緩存中有沒有這個數據,默認按照參數的值作爲key去查詢緩存,如果沒有就運行方法並將結果放入緩存;以後再來調用就可以直接使用緩存中的數據;參數:
cacheNames/value:指定緩存組件的名字;將方法的返回結果放在哪個緩存中,是數組的方式,可以指定多個緩存;
key:緩存數據使用的key;可以用它來指定。默認是使用方法參數的值 1-方法的返回值 編寫SpEL; #i d;參數id的值 #a0 #p0 #root.args[0] getEmp[2]
keyGenerator:key的生成器;可以自己指定key的生成器的組件id
key/keyGenerator:二選一使用;
cacheManager:指定緩存管理器;或者cacheResolver指定獲取解析器
condition:指定符合條件的情況下才緩存;
condition = “#id>0”
condition = “#a0>1”:第一個參數的值》1的時候才進行緩存
unless:否定緩存;當unless指定的條件爲true,方法的返回值就不會被緩存;可以獲取到結果進行判斷
unless = “#result == null”
unless = “#a0==2”:如果第一個參數的值是2,結果不緩存;
代碼演示:
@Cacheable(value = {"emp"})
public Employee getEmp(Integer id){
System.out.println("查詢"+id+"號員工");
Employee emp = employeeMapper.getEmpById(id);
return emp;
}
更新:
@CachePut:
@CachePut:既調用方法,又更新緩存數據;同步更新緩存
修改了數據庫的某個數據,同時更新緩存;
運行時機:
- 1、先調用目標方法
- 2、將目標方法的結果緩存起來
注意事項:
1、查詢1號員工;查到的結果會放在緩存中;
* key:1 value:lastName:張三
2、以後查詢還是之前的結果
3、更新1號員工;【lastName:zhangsan;gender:0】將方法的返回值也放進緩存了;
* key:傳入的employee對象 值:返回的employee對象;
4、查詢1號員工?
- 應該是更新後的員工;
爲什麼是沒更新前的?【1號員工沒有在緩存中更新】
key = “#employee.id”:使用傳入的參數的員工id;
key = “#result.id”:使用返回後的id
@Cacheable的key是不能用#result
代碼演示:
@CachePut(/*value = "emp",*/key = "#result.id")
public Employee updateEmp(Employee employee){
System.out.println("updateEmp:"+employee);
employeeMapper.updateEmp(employee);
return employee;
}
刪除:
@CacheEvict
* @CacheEvict:緩存清除
* key:指定要清除的數據
* allEntries = true:指定清除這個緩存中所有的數據
* beforeInvocation = false:緩存的清除是否在方法之前執行
* 默認代表緩存清除操作是在方法執行之後執行;如果出現異常緩存就不會清除
*
* beforeInvocation = true:
* 代表清除緩存操作是在方法運行之前執行,無論方法是否出現異常,緩存都清除
*
*
*/
@CacheEvict(value="emp",beforeInvocation = true/*key = "#id",*/)
public void deleteEmp(Integer id){
System.out.println("deleteEmp:"+id);
//employeeMapper.deleteEmpById(id);
int i = 10/0;
}
複雜:
@Caching
@Caching 定義複雜的緩存規則 @Caching(
cacheable = {
@Cacheable(/*value="emp",*/key = "#lastName")
},
put = {
@CachePut(/*value="emp",*/key = "#result.id"),
@CachePut(/*value="emp",*/key = "#result.email")
}
)