最近在学习SpringBoot有关缓存的这一块知识,遇到了一个小坑,今天来记录一下下
不知道大家伙有没有碰到一个问题,在使用@CachePut
注解来缓存之后,再次查询缓存,却发现还是老数据?
先上原本controller
的代码,这里为了方便,请求方式全部都为get请求:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/getUser/{uid}")
@Cacheable(cacheNames = "user")
public User getUser(@PathVariable int uid){
User userByUid = userMapper.findUserByUid(uid);
return userByUid;
}
@GetMapping("/updateUser")
@CachePut(cacheNames = "user")
public User updateUser(User user){
userMapper.updateUser(user);
return user;
}
}
在浏览器url中输入
http://localhost:8080/user/updateUser?username=leslieeeeee&password=123&uid=1
理论上更改完数据库之后,顺便更新了一波缓存,我们可以看到控制台信息,发现是对数据库进行了修改:
2020-04-20 21:17:14.339 DEBUG 1915 --- [nio-8080-exec-7] l.s.mapper.UserMapper.updateUser : ==> Preparing: update users set username = ?,password = ? where uid = ?
2020-04-20 21:17:14.340 DEBUG 1915 --- [nio-8080-exec-7] l.s.mapper.UserMapper.updateUser : ==> Parameters: leslieeeeee(String), 123(String), 1(Integer)
2020-04-20 21:17:14.362 DEBUG 1915 --- [nio-8080-exec-7] l.s.mapper.UserMapper.updateUser : <== Updates: 1
但是这个时候执行http://localhost:8080/user/getUser/1
请求,发现数据还是未更改前的样子?
其实这个问题很简单,因为缓存内部其实就是一个个的键值对,我们需要找一个值时,往往需要通过这个键(key)去查找的。我们回到controller
代码上, @Cacheable和@CachePut注解往缓存中存储读取数据时,如果不指定key属性的话,默认是以第一个参数为key值的
getUser
方法的第一个参数是uid,而updateUser
的第一个参数是User对象,它们的key值都不同,取出来的值怎么可能相同呢?
使它们的key相同即可,方式有很多种,这里我们让它们的key值都为uid
在@CachePut
注解上增加key属性,使其存储时的key为uid
@CachePut(cacheNames = "user",key = "#user.uid")
问题至此解决了,这种其实还是个人比较粗心,以后还需多多注意!