JavaEE進階知識學習----SpringBoot高階(三)快取註解
阿新 • • 發佈:2019-02-01
註解@CachePut使用
既呼叫方法,又更新快取資料,當修改了資料庫的某一個數據,同時更新快取
service層程式碼如下
@CachePut(value = "emp")
public Employee updateEmp(Employee employee){
employeeMapper.updateEmp(employee);
return employee;
}
Controller層程式碼如下
@GetMapping("emp")
public Employee update(Employee employee){
Employee emp = employeeService.updateEmp(employee);
return emp;
}
測試說明
- 先查詢id為1的員工資訊,第一次請求將查詢資料庫,然後放入快取中
- 在執行更新id為1的員工資訊,再查詢id為1的員工資訊,返回的是更新之前快取中的員工資訊
- 原因在於 @Cacheable中的key預設是引數,值是返回結果,查詢快取key是1,value是employee物件,更新方法中的@CachePut註解key是傳入的employee物件,value是返回的employee物件,
- 更新之後查詢應該返回的是更新的資料,也就是快取中的資料沒有更新,原因在於兩次的key不一樣導致,修改如下
@CachePut(value = "emp" ,key = "#employee.id" )
public Employee updateEmp(Employee employee){
employeeMapper.updateEmp(employee);
return employee;
}
註解@CacheEvict的使用
註解@CacheEvict清除快取,通過使用value,key屬性清除指定快取中指定key的快取資料,有一個allEntries屬性,預設是false,意思就是是否刪除指定快取中的所有key的快取資料。beforeInvocation = false屬性表示快取的清除是否在方法執行之前執行,預設是在方法之後執行,如果出現異常就不會清除快取,如果在方法之前執行,就是不管方法是否執行成功都會清除快取資料
services層程式碼如下
@CacheEvict(value = "emp",key = "#id")
public void deleteEmpById(Integer id){
employeeMapper.deleteEmpById(id);
}
controller層程式碼如下
@GetMapping("/delemp/{id}")
public void deleteEmp(@PathVariable("id")Integer id){
employeeService.deleteEmpById(id);
}
@Cacheable,@CachePut,@CacheEvict的區別
- 註解@Cacheable是先呼叫快取中的資料,如果沒有在呼叫@Cacheable註解的方法
- 註解@CachePut是先呼叫目標方法,然後再將目標方法的返回結果放入快取資料中
- 註解@CacheEvict的執行先後可以誰用屬性配置改變
註解@Caching複雜快取配置的使用
Mapper層程式碼如下
@Select("select * from employee where lastName = #{lastName}")
Employee getEmpByLastName(String lastName);
service層程式碼如下
@Caching(
cacheable = {
@Cacheable(value = "emp",key = "#lastName")
},
put = {
@CachePut(value = "emp",key = "#result.id"),
@CachePut(value = "emp",key = "#result.email")
}
)
public Employee getEmpByLastName(String lastName){
Employee emp = employeeMapper.getEmpByLastName(lastName);
return emp;
}
上述定義的複雜快取規則簡單講就是使用名字查詢後,快取中有了key為id的快取資訊,key為email的快取資訊
Controller層程式碼如下
@GetMapping("/emp/lastName/{lastName}")
public Employee getEmpByLastName(@PathVariable("lastName") String lastName){
return employeeService.getEmpByLastName(lastName);
}
註解@CacheConfig的使用
在前面中我們對每一個方法都寫了@CacheEvict(value = “emp”,key = “#id”)中的value屬性,指定快取到哪裡。我們可以使用@CacheConfig註解指明一個類的所有方法都快取到哪裡,用什麼key等資訊
@Service
@CacheConfig(cacheNames = "emp")
public class EmployeeService {
總結
快取預設使用的ConcurrentMapCacheManager == ConcurrentMapCache,將資料儲存在ConcurrentMap,但是在開發中我們經常使用的快取中介軟體:redis,memcached.ehcahe等