`

Spring缓存注解@Cache使用

 
阅读更多

参考资料

http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/

http://swiftlet.net/archives/774

 

缓存注解有以下三个:

@Cacheable      @CacheEvict     @CachePut

 

@Cacheable(value=”accountCache”),这个注释的意思是,当调用这个方法的时候,会从一个名叫 accountCache 的缓存中查询,如果没有,则执行实际的方法(即查询数据库),并将执行的结果存入缓存中,否则返回缓存中的对象。这里的缓存中的 key 就是参数 userName,value 就是 Account 对象。“accountCache”缓存是在 spring*.xml 中定义的名称。

示例:

 

@Cacheable(value="accountCache")// 使用了一个缓存名叫 accountCache 
public Account getAccountByName(String userName) {
     // 方法内部实现不考虑缓存逻辑,直接实现业务
     System.out.println("real query account."+userName); 
     return getFromDB(userName); 
} 

 

 

@CacheEvict 注释来标记要清空缓存的方法,当这个方法被调用后,即会清空缓存。注意其中一个 @CacheEvict(value=”accountCache”,key=”#account.getName()”),其中的 Key 是用来指定缓存的 key 的,这里因为我们保存的时候用的是 account 对象的 name 字段,所以这里还需要从参数 account 对象中获取 name 的值来作为 key,前面的 # 号代表这是一个 SpEL 表达式,此表达式可以遍历方法的参数对象,具体语法可以参考 Spring 的相关文档手册。

示例:

 

@CacheEvict(value="accountCache",key="#account.getName()")// 清空accountCache 缓存  
public void updateAccount(Account account) {
     updateDB(account); 
} 
  
@CacheEvict(value="accountCache",allEntries=true)// 清空accountCache 缓存
public void reload() {
     reloadAll()
}

@Cacheable(value="accountCache",condition="#userName.length() <=4")// 缓存名叫 accountCache 
public Account getAccountByName(String userName) { 
 // 方法内部实现不考虑缓存逻辑,直接实现业务
 return getFromDB(userName); 
}

 

@CachePut 注释,这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新。

示例:

 

@CachePut(value="accountCache",key="#account.getName()")// 更新accountCache 缓存
public Account updateAccount(Account account) { 
   return updateDB(account); 
} 

 

@Cacheable、@CachePut、@CacheEvict 注释介绍

通过上面的例子,我们可以看到 spring cache 主要使用两个注释标签,即 @Cacheable、@CachePut 和 @CacheEvict,我们总结一下其作用和配置方法。

表 1. @Cacheable 作用和配置方法
@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@Cacheable 主要的参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@Cacheable(value=”mycache”) 或者 
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
表 2. @CachePut 作用和配置方法
@CachePut 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用
@CachePut 主要的参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@Cacheable(value=”mycache”) 或者 
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
表 3. @CacheEvict 作用和配置方法
@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空
@CacheEvict 主要的参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@CachEvict(value=”mycache”) 或者 
@CachEvict(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@CachEvict(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才清空缓存 例如:
@CachEvict(value=”testcache”,
condition=”#userName.length()>2”)
allEntries 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 例如:
@CachEvict(value=”testcache”,beforeInvocation=true)

分享到:
评论
6 楼 アリス 2017-09-23  
请问下@CacheEvict想删除多个缓存要怎么做,比如在添加数据的时候删除查询缓存和数据条数缓存
5 楼 Finder 2016-04-27  
zwllxs 写道
楼主,如果一个方法中,有对象类型的参数,此时如果 @Cacheable中只配置一个value,系统会不走缓存,有啥办法吗?

比如:

@Cacheable(value = CacheConstant.newsCache)
    public String loadNewsList(DeNewsTitle deNewsTitleVo, @PathVariable("posId") int posId)

这时缓存是不起作用的

之所以不走缓存,是因为每次创建了不同的 DeNewsTitle 对象,缓存的 key 生成策略认为不是同一个参数。解决方法是为 DeNewsTitle 对象添加 equals() 和 hashCode() 实现即可
4 楼 zwllxs 2016-03-30  
楼主,如果一个方法中,有对象类型的参数,此时如果 @Cacheable中只配置一个value,系统会不走缓存,有啥办法吗?

比如:

@Cacheable(value = CacheConstant.newsCache)
    public String loadNewsList(DeNewsTitle deNewsTitleVo, @PathVariable("posId") int posId)

这时缓存是不起作用的
3 楼 antor 2016-03-10  

使用 @Cacheable(value ="test1", key="#t1.getReceivCityName()")

出现这样的错误代码 是怎么回事
EL1011E:(pos 4): Method call: Attempted to call method getReceivCityName() on null context object
2 楼 tom_seed 2015-05-07  
tuspark 写道
文章讲解的不错,关于Spring缓存注解@Cache使用内容,还可以看这篇文章:http://swiftlet.net/archives/774

谢谢夸奖
1 楼 tuspark 2015-04-25  
文章讲解的不错,关于Spring缓存注解@Cache使用内容,还可以看这篇文章:http://swiftlet.net/archives/774

相关推荐

    详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    Spring 缓存注解 @Cacheable、@CachePut、@CacheEvict 使用详解 Spring 框架提供了三个缓存注解:@Cacheable、@CachePut 和 @CacheEvict,这三个注解可以帮助开发者简化缓存的使用,提高应用程序的性能。在本文中,...

    spring-cache(通过key值更新缓存)

    Spring Cache提供了基于注解的缓存支持,允许开发者在方法级别声明缓存行为。通过在方法上使用`@Cacheable`、`@CacheEvict`和`@Caching`等注解,可以轻松地控制缓存的存取和清除。 1. **@Cacheable**:这个注解用于...

    java学习之SpringCache之@CachePut注解的使用说明

    这篇我们讲讲怎么使用SpringCache中的@CachePut。 功能说明 我们在日常使用缓存的时候,不仅需要添加缓存、删除缓存,更需要更新缓存。Springcache中如何来实现缓存的更新呢?不错,@CachePut就能帮助我们来实现...

    java之SpringCache之@Cacheable注解的说明使用

    在Spring3.1以后增加了一项happy的技术点,就是基于注解来实现缓存的技术。他的本质上不是具体的缓存方案实现,而是一个对缓存的抽象,让我们通过注解,实现少量的代码,达到实现缓存的方案。 Cacheable的说明 @...

    spring缓存机制-@CachePut的用法(四)

    在本篇内容中,我们将聚焦于`@CachePut`注解的使用,这是一种特殊的缓存注解,用于将方法的执行与缓存更新相结合。 `@CachePut`是Spring Cache模块提供的一个注解,它的主要作用是在方法执行后将结果存入指定的缓存...

    springboot 使用spring cache缓存 和 使用fastjson配置redis系列化

    在应用中启用Spring Cache,我们需要创建一个配置类,该类使用`@EnableCaching`注解开启缓存功能。同时,为了处理缓存中的对象序列化问题,我们使用Fastjson替换默认的JDK序列化。这通常涉及到创建一个自定义的`...

    Spring基于注解的缓存配置--web应用实例

    这个注解是Spring Cache的核心,用于标记那些可缓存的方法。当一个带有@Cacheable的方法被调用时,Spring会检查是否有已缓存的结果。如果有,它会立即返回,而不会执行方法本身。如果缓存中没有,执行方法并把结果...

    springboot1.x基于spring注解实现J2Cache两级缓存集成

    在本文中,我们将深入探讨如何在Spring Boot 1.x版本中使用Spring注解来实现J2Cache的两级缓存机制,其中包括一级缓存Ehcache和二级缓存Redis。通过这种方式,我们可以显著提高应用程序的性能,减少对数据库的依赖,...

    Spring 缓存

    Spring 缓存机制的实现主要有两种方法:使用 Spring 与 Ehcache 结合,使用注解的方式对指定的方法进行缓存;封装 Guava 缓存,使用 Guava 包中的缓存机制。 方法一:使用 Spring 与 Ehcache 结合 使用 Spring 与 ...

    spring简单的缓存

    这个注解会开启缓存注解的处理,使我们可以在方法上使用`@Cacheable`、`@CacheEvict`等注解。 2. **配置缓存**: 需要在Spring配置中声明所使用的缓存 provider。例如,如果选择EhCache作为缓存管理器,需要添加...

    JetCache是一个基于Java的缓存系统封装提供统一的API和注解来简化缓存的使用

    JetCache 是一个专为 Java 应用设计的高效、轻量级的缓存系统封装框架,旨在简化缓存的管理和使用。它通过提供统一的 API 接口和注解,使得开发者能够快速地在项目中集成缓存功能,提升应用程序的性能和响应速度。...

    java中SpringCache之@CacheEvict注解的使用说明

    beforeInvocation的意思是:当执行注解标注的这个方法之前限制性清除缓存的操作,这样就会使得,不管这个方法执行是否成功,该缓存都会被清除。保证了清除缓存的效果。 他的默认值是false。当为false的时候不执行。...

    自定义注解实现缓存机制

    最后,我们可以在需要缓存结果的业务方法上使用自定义的`@CacheResult`注解。例如: ```java @Service public class UserService { @CacheResult public User getUserById(Long id) { // 这里的查询会被缓存,...

    redis-cluster和spring集成,基于cache注解

    4. **启用缓存注解**:在需要缓存的方法或类上使用 `@Cacheable`、`@CacheEvict` 和 `@CachePut` 注解。 **四、实战案例** 以下是一个简单的使用示例,展示了如何在 Spring Boot 应用中使用 Redis 集群和 `@...

    spring缓存实例

    在提供的"20140527demoSpringCache"示例中,可能包含了一个完整的Spring缓存示例应用,包括配置文件、缓存管理器的定义以及使用注解的业务逻辑。通过学习这个示例,我们可以更直观地理解Spring缓存的工作原理和实际...

    (SSM框架)memcached整合Spring基于Cache注解.

    在MyBatis的Mapper接口方法上使用Spring的Cache注解,实现查询结果的缓存。 8. **性能优化**: 使用Memcached需要注意缓存穿透、缓存雪崩和缓存击穿等问题。可以通过设置合理的过期时间、使用布隆过滤器防止穿透、...

    springboot 使用spring cache缓存 和 缓存数据落地到redis

    【Spring Boot 使用 Spring Cache 缓存与数据落地到 Redis】\n\n在Spring Boot应用中,Spring Cache是一个强大的工具,可以极大地提升应用的性能,通过缓存非计算性或者昂贵的计算结果。Spring Cache抽象了缓存管理...

    Spring整合Redis用作缓存-注解方式

    在本文中,我们将深入探讨如何使用Spring框架与Redis集成,以实现高效的缓存管理。Redis是一种内存中的数据结构存储系统,常被用作数据库、缓存和消息中间件。Spring框架提供了一种灵活且强大的方式来整合Redis,...

    浅析SpringCache缓存1

    6. **JSR-107 支持**:从 Spring 4.1 开始,Spring Cache 添加了对 JSR-107(Java Caching API)标准的注解支持,使得开发者可以直接使用 JSR-107 提供的缓存注解,如 `@CacheResult`、`@CacheEvictAll` 等,增强了...

Global site tag (gtag.js) - Google Analytics