既调用方法,足球平台系统出租Q一89076848稳定系统出租~又更新缓存数据,当修改了数据库的某一个数据,同时更新缓存
service层代码如下
@CachePut(value = "emp")
public Employee updateEmp(Employee employee){
employeeMapper.updateEmp(employee);
return employee;
}
- 1
- 2
- 3
- 4
- 5
Controller层代码如下
@GetMapping("emp")
public Employee update(Employee employee){
Employee emp = employeeService.updateEmp(employee);
return emp;
}
- 1
- 2
- 3
- 4
- 5
测试说明
- 先查询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;
}
- 1
- 2
- 3
- 4
- 5
注解@CacheEvict的使用
注解@CacheEvict清除缓存,通过使用value,key属性清除指定缓存中指定key的缓存数据,有一个allEntries属性,默认是false,意思就是是否删除指定缓存中的所有key的缓存数据。beforeInvocation = false属性表示缓存的清除是否在方法执行之前执行,默认是在方法之后执行,如果出现异常就不会清除缓存,如果在方法之前执行,就是不管方法是否执行成功都会清除缓存数据