博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring 缓存 @CachePut 和 @Cacheable 区别
阅读量:6150 次
发布时间:2019-06-21

本文共 1874 字,大约阅读时间需要 6 分钟。

首先这两个的区别是:

@CachePut:这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中。

@Cacheable:当重复使用相同参数调用方法的时候,方法本身不会被调用执行,即方法本身被略过了,取而代之的是方法的结果直接从缓存中找到并返回了。

那么对于@CachePut这个注解,它的作用是什么呢,每次方法都执行,那么缓存的意义是什么呢?在这里写了一个小实例对这两个标签进行测试,并解释了上边这个疑问。

首先,我们猜想对于同一个缓存实例的相同的key的缓存的数据,可以用@CachePut更新,而@Cacheable在取值的时候,是@CachePut更新后的值。

先看看service:

@Cacheable(value="userCache",key="1000")    public String getUserByName(String userName) {        System.out.println("两次调用第一次会执行,第二次不会执行!");       return getFromDB(userName);     }         @CachePut(value="userCache",key="1000")    public String updateUserPut(String userName) {       return updateDB(userName);     }
注意这里的key定义的都是1000,缓存的实例都是userCache

测试方法:

// 加载 spring 配置文件        ApplicationContext context = new ClassPathXmlApplicationContext("com/spricache/config/spring-cache.xml");        UserService userService = (UserService) context.getBean("userService");         //会查询数据库        System.out.println(userService.getUserByName("txxs"));        //会走缓存        System.out.println(userService.getUserByName("txxs"));        //更新名字,会走数据库        System.out.println(userService.updateUserPut("txxsNew"));        //会走缓存呢,还是数据库呢?        System.out.println(userService.getUserByName("txxsNew"));
执行的结果:

两次调用第一次会执行,第二次不会执行!

正在从数据库查询txxs
txxs
txxs
更新数据库txxsNew
txxsNew
txxsNew

我们来分析这个结果:System.out.println(userService.getUserByName("txxs"));被执行两次,第一次是从数据库中取值,第二次是从缓存中取值,这和我们之前所了解的缓存用法是一样的。那么我们调用System.out.println(userService.updateUserPut("txxsNew"));这个方法会更新数据库中的名字,注意这里的key值我们定义的是1000,也就是会更新userCache中key为1000的值,然后将会返回的结果,这里我们也做了一个输出操作,也就是第一个txxsNew。然后再调用System.out.println(userService.getUserByName("txxsNew"));获取key为1000的名字,输出的结果是txxsNew,正是updateUserPut方法更新后的缓存的值。

总结:@CachePut@Cacheable这两个标签可以结合使用,当需要根据请求改变值的时候,利用@CachePut将值改变并写入到缓存中,而@Cacheable标签除了第一次之外,一直是取的缓存的值。注意结合使用时需要注意两点:

1、必须是同一个缓存实例。

2、key值必须是相同的。

 

转载于:https://www.cnblogs.com/gscq073240/articles/7882117.html

你可能感兴趣的文章
java操作oracle的blob,clob数据
查看>>
[bzoj 1861][zjoi2006] 书架
查看>>
react-native 修改Android包名(亲测可用)
查看>>
Vue生命周期整理
查看>>
BZOJ3437:小P的牧场(斜率优化DP)
查看>>
MIT自然语言处理第三讲:概率语言模型(第四部分)
查看>>
使用python处理selenium中的鼠标悬停问题
查看>>
Oracle使用order by排序关于null值处理
查看>>
action间传多个参数时注意问题
查看>>
Vue2.0环境搭建和测试demo
查看>>
Windows 下安装Lua: 使用Visual Studio 2017来编译安装Lua
查看>>
JS使用默认图片代替页面上无法显示的图片
查看>>
Codeforces 918C - The Monster
查看>>
2016 Russian Code Cup (RCC 16), Final Round B - Cactusophobia
查看>>
左边定宽,右边自适应布局的几种方法
查看>>
Electron学习入门
查看>>
Chapter 2、Eclipse(19th,Feb1)
查看>>
Vue和SuperSlide做轮播效果
查看>>
Spring源码分析——BeanFactory体系之接口详细分析
查看>>
你需要知道的三个 CSS3技巧(转)
查看>>