@CachePut:即调用方法还更新数据
修改了数据库同时更新缓存
实例讲解:
在上一节的基础上EmployeeService中添加更新员工的方法,这里指定把返回结果放入的缓存组件和查询方法是一样的(组件名唯一)
另外把上一节中自定义的key生成器注解掉了
@Service public class EmployeeService { @Autowired EmployeeMapper employeeMapper; @Cacheable(cacheNames = {"emp"}) //,keyGenerator = "myKeyGenerator",condition = "#id>1" public Employee getEmp(Integer id){ System.out.println("查询"+id+"号员工"); Employee employee = employeeMapper.getEmpById(id); return employee; } /** * @CachePut:既调用方法,又更新缓存数据 * 修改数据库中某个数据,同时更新缓存 * 运行时机: * 1、先调用目标方法 * 2、将目标方法的放回结果缓存起来 */ @CachePut(value = {"emp"}) public Employee updateEmp(Employee employee){ System.out.println("更新了"+employee.getId()+"号员工的信息"); employeeMapper.updateEmp(employee); return employee; } }
controller层添加相应方法(这里只是简单测试缓存的知识点,所以简单用的Get请求)
@GetMapping("/emp") public Employee updateEmployee(Employee employee){ Employee emp = employeeService.updateEmp(employee); return emp; }
测试步骤:
1、查询2号员工的数据,查到的数据会放在缓存中 {"id":2,"lastName":"李四","email":"lisi@qq.com","gender":0,"dId":null}
2、以后查询还是之前的数据
3、更新2号员工;同时更新了缓存 emp?id=2&lastName=王五&email=wangwu@qq.com&gender=1
4、更新成功后我们再查询2号员工没有发送查询语句,只是在缓存中查找
但查出的数据还是{"id":2,"lastName":"李四","email":"lisi@qq.com","gender":0,"dId":null}
并没有拿到2号员工更新后的数据;这是为什么?
原因是:虽然查询和更新后的返回结果都是放入指定emp缓存组件中,
但是两个方法执行后放入缓存组件中的key不一样,
所以在查询中通过查询方法中的key找的2号员工,而更新方法中是根据更新方法中的key更新2号员工
自然是两个互不影响的数据,所以想要更新方法执行时缓存中更新的同一个数据,
只需要把两个方法的key值统一,查询和更新之后缓存中的数据就是同一个了
5、修改service的update方法:
/** * @CachePut:既调用方法,又更新缓存数据 * 修改数据库中某个数据,同时更新缓存 * 运行时机: * 1、先调用目标方法 * 2、将目标方法的放回结果缓存起来 * * 测试步骤: * 1、查询2号员工的数据,查到的数据会放在缓存中{"id":2,"lastName":"李四","email":"lisi@qq.com","gender":0,"dId":null} * 2、以后查询还是之前的数据 * 3、更新2号员工;同时更新了缓存 emp?id=2&lastName=王五&email=wangwu@qq.com&gender=1 * 4、更新成功后我们再查询2号员工没有发送查询语句,只是在缓存中查找 * 但查出的数据还是{"id":2,"lastName":"李四","email":"lisi@qq.com","gender":0,"dId":null} * 并没有拿到2号员工更新后的数据;这是为什么? * 原因是:虽然查询和更新后的返回结果都是放入指定emp缓存组件中, * 但是两个方法执行后放入缓存组件中的key不一样, * 所以在查询中通过查询方法中的key找的2号员工,而更新方法中是根据更新方法中的key更新2号员工 * 自然是两个互不影响的数据,所以想要更新方法执行时缓存中更新的同一个数据, * 只需要把两个方法的key值统一,查询和更新之后缓存中的数据就是同一个了 * key = "#result.id"或者 * key = "#employee.id" 这里效果都一样(注意在@Cacheable注解中的key不能用#result;因为@Cacheable在执行方法之前需要根据key查询缓存) */ @CachePut(value = {"emp"},key = "#result.id") public Employee updateEmp(Employee employee){ System.out.println("更新了"+employee.getId()+"号员工的信息"); employeeMapper.updateEmp(employee); return employee; }
6、重启项目,再按上面步骤执行;可以发现更新之后,查询也查询的是更新之后的数据了