原文地址 http://jinnianshilongnian.iteye.com/blog/2001040
@CachePut
应用到写数据的方法上,如新增/修改方法,调用方法时会自动把相应的数据放入缓存:
- @CachePut(value = "user", key = "#user.id")
- public User save(User user) {
- users.add(user);
- return user;
- }
即调用该方法时,会把user.id作为key,返回值作为value放入缓存;
@CachePut注解:
- public @interface CachePut {
- String[] value(); //缓存的名字,可以把数据写到多个缓存
- String key() default ""; //缓存key,如果不指定将使用默认的KeyGenerator生成,后边介绍
- String condition() default ""; //满足缓存条件的数据才会放入缓存,condition在调用方法之前和之后都会判断
- String unless() default ""; //用于否决缓存更新的,不像condition,该表达只在方法执行之后判断,此时可以拿到返回值result进行判断了
- }
@CacheEvict
即应用到移除数据的方法上,如删除方法,调用方法时会从缓存中移除相应的数据:
- @CacheEvict(value = "user", key = "#user.id") //移除指定key的数据
- public User delete(User user) {
- users.remove(user);
- return user;
- }
- @CacheEvict(value = "user", allEntries = true) //移除所有数据
- public void deleteAll() {
- users.clear();
- }
@CacheEvict注解:
- public @interface CacheEvict {
- String[] value(); //请参考@CachePut
- String key() default ""; //请参考@CachePut
- String condition() default ""; //请参考@CachePut
- boolean allEntries() default false; //是否移除所有数据
- boolean beforeInvocation() default false;//是调用方法之前移除/还是调用之后移除
@Cacheable
应用到读取数据的方法上,即可缓存的方法,如查找方法:先从缓存中读取,如果没有再调用方法获取数据,然后把数据添加到缓存中:
- @Cacheable(value = "user", key = "#id")
- public User findById(final Long id) {
- System.out.println("cache miss, invoke find by id, id:" + id);
- for (User user : users) {
- if (user.getId().equals(id)) {
- return user;
- }
- }
- return null;
- }
@Cacheable注解:
- public @interface Cacheable {
- String[] value(); //请参考@CachePut
- String key() default ""; //请参考@CachePut
- String condition() default "";//请参考@CachePut
- String unless() default ""; //请参考@CachePut
运行流程
- 1、首先执行@CacheEvict(如果beforeInvocation=true且condition 通过),如果allEntries=true,则清空所有
- 2、接着收集@Cacheable(如果condition 通过,且key对应的数据不在缓存),放入cachePutRequests(也就是说如果cachePutRequests为空,则数据在缓存中)
- 3、如果cachePutRequests为空且没有@CachePut操作,那么将查找@Cacheable的缓存,否则result=缓存数据(也就是说只要当没有cache put请求时才会查找缓存)
- 4、如果没有找到缓存,那么调用实际的API,把结果放入result
- 5、如果有@CachePut操作(如果condition 通过),那么放入cachePutRequests
- 6、执行cachePutRequests,将数据写入缓存(unless为空或者unless解析结果为false);
- 7、执行@CacheEvict(如果beforeInvocation=false 且 condition 通过),如果allEntries=true,则清空所有
流程中需要注意的就是2/3/4步:
如果有@CachePut操作,即使有@Cacheable也不会从缓存中读取;问题很明显,如果要混合多个注解使用,不能组合使用@CachePut和@Cacheable;官方说应该避免这样使用(解释是如果带条件的注解相互排除的场景);不过个人感觉还是不要考虑这个好,让用户来决定如何使用,否则一会介绍的场景不能满足。
相关推荐
**Spring与Ehcache集成详解** 在现代Java应用开发中,缓存技术是提升系统性能的关键环节。Ehcache作为一款流行的开源缓存解决方案,因其轻量级、高性能和易于集成的特点,常被广泛应用于Spring框架中。本篇文章将...
在本文中,我们将深入探讨如何将EhCache与Spring Boot集成,以便在应用程序中实现高效的数据缓存。EhCache是一个流行的Java缓存框架,它以其高性能和轻量级特性而受到广泛使用,尤其在Hibernate中作为默认的...
Spring Cache 支持多种缓存后端,包括Ehcache、Guava、Redis等。 **概念** Spring Cache的核心接口有两个:`org.springframework.cache.Cache`和`org.springframework.cache.CacheManager`。`Cache`接口代表缓存...
通过在`spring-config.xml`中配置`<bean>`和`<ehcache:cacheManager>`标签,即可启用ehcache缓存服务,并通过`@Cacheable`、`@CachePut`、`@CacheEvict`等注解实现方法级别的缓存控制。 **5. 分布式缓存集群配置:*...
### Spring与ehcache结合使用详解 #### 一、前言 在现代软件开发中,缓存技术被广泛应用于提高应用程序的性能。其中,Spring框架因其灵活性和强大的功能,在Java领域得到了广泛应用;而ehcache作为一款高性能、...
【Spring + Ehcache 整合应用详解】 在Java企业级开发中,缓存技术是提高系统性能的关键之一。Spring框架提供了对多种缓存机制的支持,其中包括Ehcache。本示例"spring+ehcache demo"将带你深入理解如何在Spring...
**Spring+EhCache缓存实例详解** 在现代的Java企业级应用中,缓存技术扮演着至关重要的角色,它能够显著提升系统性能,减少数据库负载。Spring框架与EhCache的结合,为开发者提供了一种高效、易用的缓存解决方案。...
在Spring Boot 2.x中,EhCache是一个常用的缓存解决方案,用于提高应用程序性能和减少数据库负载。在本文中,我们将深入探讨如何在Spring Boot环境中配置和使用EhCache进行缓存。 首先,Spring Boot自动配置缓存...
【Spring3 Hibernate4 Ehcache整合实例详解】 在Java企业级应用开发中,Spring、Hibernate和Ehcache是三个非常重要的框架和技术。Spring作为轻量级的IoC(Inversion of Control)和AOP(Aspect Oriented ...
Spring 缓存机制详解 Spring 缓存机制是 Spring 框架中的一种机制,用于提高应用程序的性能和效率。缓存机制可以将频繁访问的数据存储在内存中,以便快速地检索数据,减少数据库查询的次数,从而提高应用程序的性能...
【Spring Ecache缓存注解详解】 Spring框架从3.1版本开始引入了对缓存的支持,这使得在应用程序中实现缓存管理变得更加便捷。Spring Cache的设计理念与Spring的事务管理相似,它允许开发者在方法级别声明缓存,从而...
### Spring 整合 EhCache 实现原理与应用详解 #### 一、Spring 对 Cache 的支持 从 Spring 3.1 版本开始,Spring 框架正式引入了对 Cache 的支持,这种支持的方式和原理与 Spring 对事务管理的支持非常类似。通过...
### Spring整合EhCache详细教程 #### Spring缓存抽象与核心思想 在开始Spring整合EhCache之前,首先需要理解Spring缓存的核心概念及其抽象机制。Spring框架本身并不提供具体的缓存实现,但它提供了一套统一的缓存...
### Ehcache分布式缓存及其在Spring中的应用 #### 一、Ehcache概述与原理 Ehcache是一款高效且轻量级的纯Java缓存框架,由于其出色的性能和易于集成的特点,在Java开发中有着广泛的应用。作为Hibernate的默认缓存...
**Spring缓存配置详解** 在Java Web开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring的缓存管理是提升应用性能的关键部分,它允许我们将经常访问但变化不频繁的数据存储在内存中,以减少对...
**Spring Redis 缓存实例详解** 在现代的Web应用程序开发中,缓存是提高系统性能的关键技术之一。Spring框架提供了一种优雅的方式来整合缓存管理,其中包括对Redis的支持。Redis是一个开源的、高性能的键值数据库,...
在本文中,我们将深入探讨如何在Spring Boot 1.x版本中使用Spring注解来实现J2Cache的两级缓存机制,其中包括一级缓存Ehcache和二级缓存Redis。通过这种方式,我们可以显著提高应用程序的性能,减少对数据库的依赖,...
**Spring MVC Ehcache 整合详解** 在Java Web开发中,Spring MVC是一个广泛使用的MVC框架,它提供了灵活的模型视图控制器架构,方便我们构建可维护、高性能的应用程序。而Ehcache则是一个非常流行的Java缓存解决...