一、@CachePut
@CachePut:既调用方法,又更新缓存数据,同步更新缓存,修改了数据库的某个数据,同时更新缓存。
注意:存取使用的 key 必须是同一个。
运行时机:
1、先调用目标方法
2、将目标方法的结果缓存起来
测试步骤:
1、先查询1号员工,查到的结果会放到缓存中
key:id=1 的参数
value: 1号员工
2、以后查询还是之前缓存中的结果
3、更新1号员工
将方法的返回值也放进缓存了:
key:传入参数 employee 对象
value:返回的 employee 对象
4、再来查询1号员工
应该是更新后的员工
key = "#emp.id" ,使用传入的参数的 id 进行更新
key = "#result.id" 参数与返回值一样
注意:@Cacheable 的 key 不能用 #result【要先用key去缓存中查询】
为什么是没有更新前的? 【1号员工没有在缓存中更新,使用的 key 不一样】
二、示例代码
1、查询员工
@Cacheable(cacheNames = {"emp"}) //默认的key就是参数 id
public Employee getEmpById(Integer id) {
System.out.println("查询" + id +"号员工");
return employeeMapper.getEmpById(id);
}
2、更新员工
@CachePut(value = {"emp"}, key = "#result.id")
public Employee updateEmp(Employee emp) {
System.out.println("updateEmp:" + emp);
Integer result = employeeMapper.updateEmp(emp);
return emp;
}
使用 @CachePut 生效,必须要与存放缓存的 key 一致。