1. 程式人生 > >JavaEE進階知識學習----SpringBoot高階(三)快取註解

JavaEE進階知識學習----SpringBoot高階(三)快取註解

註解@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等