spring 缓存 @CachePut 和 @Cacheable 区别

首先这两个的区别是:

@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值必须是相同的。

美团招聘,有意向的私信我

岗位名称:美团到家事业群-外卖技术部-JAVA高级工程师
职级要求:P2-3~P3-2

岗位职责:
- 负责上单业务系统的开发工作,深入理解业务痛点,通过技术手段满足并促进业务快速发展需要;
- 参与系统需求分析与设计,快速响应业务需求,负责完成核心代码编写,接口规范制定;
- 参与解决项目中的重难点问题,针对复杂业务模型能够给出合理的解决方案;

岗位基本要求:
- 参与过大型复杂分布式互联网系统的设计,要求有复杂业务的开发经验和较强的逻辑/概率思维能力,善于分析、归纳、描述、沟通和解决问题;
- 本科及以上学历,扎实的计算机基础,4年及以上工作经验,长期使用Java及开源框架进行项目开发,并有一定的项目管理经验;
- 深入使用Java,熟悉掌握常用的Java类库及框架,如多线程、并发处理、I/O与网络通讯等,对Java虚拟机有较深了解;
- 擅长使用开源框架,在某个领域内对开源框架有一定的审美,做过选型研究,解读过部分或者全部源码,掌握实现原理;
- 精通 MySQL 应用开发,熟悉数据库原理和常用性能优化技术,以及 NoSQL,Queue 的原理、使用场景以及限制;
- 研究过 http 协议、搜索引擎、缓存、jvm 调优、序列化、nio、RPC 调用框架等,并且有相关实践经验;
- 有强烈的责任心和团队合作精神,良好的抗压能力,心态积极,能主动融入团队;

具备以下者优先:
- 参与过相关系统建设;
- 有高并发系统经验;
- 参与过开源工作;
- 有代码洁癖、有极客精神;

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值