SpringBoot学习之路---关于@CachePut注解的小坑

最近在学习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")

问题至此解决了,这种其实还是个人比较粗心,以后还需多多注意!

发布了60 篇原创文章 · 获赞 64 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Jokeronee/article/details/105644888