1.准备项目
所以的准备工作和这篇文章一样只是讲解@CachePut的用法
需要准备项目的朋友移步这个项目准备说明
2.@CachePut原理
* @CachePut:即调用方法,又更新缓存数据 * 可以调用方法修改数据库中的数据,同时更新缓存。 * 运行时机: * 1.先调用目标方法 * 2.将目标方法的结果进行缓存
3.代码讲解
编写更新用户的controller,添加多一个方法。
@GetMapping("/updata")
public Users updateUsers(Users users){
Users users1= userService.updataUsers(users);
return users1;
}
编写更新用户的service层,添加一个方法,在需要的方法上添加上@注解
@CachePut(value = "users")
public Users updataUsers(Users users) {
System.out.println("更新的员工信息:"+users);
usersMapper.updateUsersById(users);
return users;
}
关于mapper和实体类移步1.准备项目
4.测试
我们先来查询1 2 3 6
我们再次查询1 2 3 6
我们发现控制台不再打印内容说明缓存已经启用
这个时候我们调用更改信息的方法对6号员工进行修改,修改前的信息【WYT 、654321】
我们将6号员工的信息改为 DFP 、7788
控制台输出打印
按照@CachePut原理我们查询缓存中的6号员工缓存信息看看有没有同步更新为了测试方便我们先将控制台的日志信息清空
我们发现控制台没有打印信息说明6号员工还是在缓存内容中
但是查询的6号员工信息是修改之前
这是为什么呢?
原因
我们看看我们查询信息的缓存,我传入的参数是id所以这个时候实例化对象user.uid作为了我们的key
* 1.查询6号员工,查询结果放到缓存中因为查询的是创建的缓存为key-value模式 * key: 6 ,value:WYT 、654321 * 2.以后查询还是之前的结果 * 3.更新6号员工【WYT 654321】 * 更新缓存也是将方法的返回值放入缓存 * key;传入的对象 value:方法返回的对象 但是我们这个时候查询的6号是我们在查询信息放入的缓存信息而不是我们修改的缓存信息 * 4.解决方法查询6号员工 * 在调用更新缓存信息的时候,要设置更新缓存信息对象的key * key="#users.uid"
修改
重启项目进行测试
我们查询1 2 6员工的信息,我们发现重新启动项目后6号员工的信息是我们修改后的信息说明对数据库的操作是没有影响的。
我们再把6号的信息改为【WYT 、123456】
查询这个时候的缓存信息已经同步