`

spring Ehcache @Cacheable 详解

阅读更多

原文地址  http://jinnianshilongnian.iteye.com/blog/2001040

@CachePut 

应用到写数据的方法上,如新增/修改方法,调用方法时会自动把相应的数据放入缓存: 

Java代码   收藏代码
  1. @CachePut(value = "user", key = "#user.id")  
  2. public User save(User user) {  
  3.     users.add(user);  
  4.     return user;  
  5. }  

即调用该方法时,会把user.id作为key,返回值作为value放入缓存;

 

@CachePut注解:

Java代码   收藏代码
  1. public @interface CachePut {  
  2.     String[] value();              //缓存的名字,可以把数据写到多个缓存  
  3.     String key() default "";       //缓存key,如果不指定将使用默认的KeyGenerator生成,后边介绍  
  4.     String condition() default ""//满足缓存条件的数据才会放入缓存,condition在调用方法之前和之后都会判断  
  5.     String unless() default "";    //用于否决缓存更新的,不像condition,该表达只在方法执行之后判断,此时可以拿到返回值result进行判断了  
  6. }  

 

@CacheEvict 

即应用到移除数据的方法上,如删除方法,调用方法时会从缓存中移除相应的数据:

Java代码   收藏代码
  1. @CacheEvict(value = "user", key = "#user.id"//移除指定key的数据  
  2. public User delete(User user) {  
  3.     users.remove(user);  
  4.     return user;  
  5. }  
  6. @CacheEvict(value = "user", allEntries = true//移除所有数据  
  7. public void deleteAll() {  
  8.     users.clear();  
  9. }  

 

@CacheEvict注解:

Java代码   收藏代码
  1. public @interface CacheEvict {  
  2.     String[] value();                        //请参考@CachePut  
  3.     String key() default "";                 //请参考@CachePut  
  4.     String condition() default "";           //请参考@CachePut  
  5.     boolean allEntries() default false;      //是否移除所有数据  
  6.     boolean beforeInvocation() default false;//是调用方法之前移除/还是调用之后移除  

 

@Cacheable

应用到读取数据的方法上,即可缓存的方法,如查找方法:先从缓存中读取,如果没有再调用方法获取数据,然后把数据添加到缓存中:

Java代码   收藏代码
  1. @Cacheable(value = "user", key = "#id")  
  2.  public User findById(final Long id) {  
  3.      System.out.println("cache miss, invoke find by id, id:" + id);  
  4.      for (User user : users) {  
  5.          if (user.getId().equals(id)) {  
  6.              return user;  
  7.          }  
  8.      }  
  9.      return null;  
  10.  }  

 

@Cacheable注解:

Java代码   收藏代码
  1. public @interface Cacheable {  
  2.     String[] value();             //请参考@CachePut  
  3.     String key() default "";      //请参考@CachePut  
  4.     String condition() default "";//请参考@CachePut  
  5.     String unless() default "";   //请参考@CachePut    

 

运行流程

Java代码   收藏代码
  1. 1、首先执行@CacheEvict(如果beforeInvocation=true且condition 通过),如果allEntries=true,则清空所有  
  2. 2、接着收集@Cacheable(如果condition 通过,且key对应的数据不在缓存),放入cachePutRequests(也就是说如果cachePutRequests为空,则数据在缓存中)  
  3. 3、如果cachePutRequests为空且没有@CachePut操作,那么将查找@Cacheable的缓存,否则result=缓存数据(也就是说只要当没有cache put请求时才会查找缓存)  
  4. 4、如果没有找到缓存,那么调用实际的API,把结果放入result  
  5. 5、如果有@CachePut操作(如果condition 通过),那么放入cachePutRequests  
  6. 6、执行cachePutRequests,将数据写入缓存(unless为空或者unless解析结果为false);  
  7. 7、执行@CacheEvict(如果beforeInvocation=false 且 condition 通过),如果allEntries=true,则清空所有  

流程中需要注意的就是2/3/4步:

如果有@CachePut操作,即使有@Cacheable也不会从缓存中读取;问题很明显,如果要混合多个注解使用,不能组合使用@CachePut和@Cacheable;官方说应该避免这样使用(解释是如果带条件的注解相互排除的场景);不过个人感觉还是不要考虑这个好,让用户来决定如何使用,否则一会介绍的场景不能满足。

分享到:
评论

相关推荐

    Spring Cache的基本使用与实现原理详解

    Spring Cache 支持多种缓存后端,包括Ehcache、Guava、Redis等。 **概念** Spring Cache的核心接口有两个:`org.springframework.cache.Cache`和`org.springframework.cache.CacheManager`。`Cache`接口代表缓存...

    Spring+Ehcache集成

    **Spring与Ehcache集成详解** 在现代Java应用开发中,缓存技术是提升系统性能的关键环节。Ehcache作为一款流行的开源缓存解决方案,因其轻量级、高性能和易于集成的特点,常被广泛应用于Spring框架中。本篇文章将...

    Spring Boot整合EhCache的步骤详解

    在本文中,我们将深入探讨如何将EhCache与Spring Boot集成,以便在应用程序中实现高效的数据缓存。EhCache是一个流行的Java缓存框架,它以其高性能和轻量级特性而受到广泛使用,尤其在Hibernate中作为默认的...

    ehcache配置使用详解

    通过在`spring-config.xml`中配置`<bean>`和`<ehcache:cacheManager>`标签,即可启用ehcache缓存服务,并通过`@Cacheable`、`@CachePut`、`@CacheEvict`等注解实现方法级别的缓存控制。 **5. 分布式缓存集群配置:*...

    Spring与ehcache结合使用

    ### Spring与ehcache结合使用详解 #### 一、前言 在现代软件开发中,缓存技术被广泛应用于提高应用程序的性能。其中,Spring框架因其灵活性和强大的功能,在Java领域得到了广泛应用;而ehcache作为一款高性能、...

    spring+ehcache demo

    【Spring + Ehcache 整合应用详解】 在Java企业级开发中,缓存技术是提高系统性能的关键之一。Spring框架提供了对多种缓存机制的支持,其中包括Ehcache。本示例"spring+ehcache demo"将带你深入理解如何在Spring...

    Spring+EhCache缓存实例

    **Spring+EhCache缓存实例详解** 在现代的Java企业级应用中,缓存技术扮演着至关重要的角色,它能够显著提升系统性能,减少数据库负载。Spring框架与EhCache的结合,为开发者提供了一种高效、易用的缓存解决方案。...

    Spring Boot 2.x的EhCache缓存的使用问题详解.docx

    在Spring Boot 2.x中,EhCache是一个常用的缓存解决方案,用于提高应用程序性能和减少数据库负载。在本文中,我们将深入探讨如何在Spring Boot环境中配置和使用EhCache进行缓存。 首先,Spring Boot自动配置缓存...

    spring3 hibernate4 ehcache实例

    【Spring3 Hibernate4 Ehcache整合实例详解】 在Java企业级应用开发中,Spring、Hibernate和Ehcache是三个非常重要的框架和技术。Spring作为轻量级的IoC(Inversion of Control)和AOP(Aspect Oriented ...

    Spring 缓存

    Spring 缓存机制详解 Spring 缓存机制是 Spring 框架中的一种机制,用于提高应用程序的性能和效率。缓存机制可以将频繁访问的数据存储在内存中,以便快速地检索数据,减少数据库查询的次数,从而提高应用程序的性能...

    echache缓存注解说明文档

    【Spring Ecache缓存注解详解】 Spring框架从3.1版本开始引入了对缓存的支持,这使得在应用程序中实现缓存管理变得更加便捷。Spring Cache的设计理念与Spring的事务管理相似,它允许开发者在方法级别声明缓存,从而...

    Spring整合EhCache

    ### Spring 整合 EhCache 实现原理与应用详解 #### 一、Spring 对 Cache 的支持 从 Spring 3.1 版本开始,Spring 框架正式引入了对 Cache 的支持,这种支持的方式和原理与 Spring 对事务管理的支持非常类似。通过...

    Spring整合EhCache详细教程(史上最全)

    ### Spring整合EhCache详细教程 #### Spring缓存抽象与核心思想 在开始Spring整合EhCache之前,首先需要理解Spring缓存的核心概念及其抽象机制。Spring框架本身并不提供具体的缓存实现,但它提供了一套统一的缓存...

    Ehcache分布式缓存与其在spring中的使用

    ### Ehcache分布式缓存及其在Spring中的应用 #### 一、Ehcache概述与原理 Ehcache是一款高效且轻量级的纯Java缓存框架,由于其出色的性能和易于集成的特点,在Java开发中有着广泛的应用。作为Hibernate的默认缓存...

    详解Spring整合Ehcache管理缓存

    # Spring 整合 Ehcache 管理缓存详解 Ehcache 是一个高性能、轻量级的缓存框架,适用于 Java 应用程序。它可以极大地提高数据访问速度,减轻数据库负载。Spring 框架则提供了对缓存功能的抽象,允许开发者选择不同...

    Spring缓存配置

    **Spring缓存配置详解** 在Java Web开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring的缓存管理是提升应用性能的关键部分,它允许我们将经常访问但变化不频繁的数据存储在内存中,以减少对...

    Spring Redis缓存实例

    **Spring Redis 缓存实例详解** 在现代的Web应用程序开发中,缓存是提高系统性能的关键技术之一。Spring框架提供了一种优雅的方式来整合缓存管理,其中包括对Redis的支持。Redis是一个开源的、高性能的键值数据库,...

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

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

Global site tag (gtag.js) - Google Analytics