`

160. Spring Boot Ehcache使用@Cacheable同key不同value是否能被缓存?

阅读更多

 

【视频&交流平台】

à SpringBoot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

需求缘起:

       有人咨询博主,如下问题:



 

 

上面的问题翻译下就是:使用@Cacheablekey不同value是否能被缓存?

对于这个问题,试一下就知道怎么回事了,好了,这篇博客就是为了解答此问题。

本节大纲:

写道
(1)问题1:@Cacheable中的value代表什么?
(2)问题2:value对应的ehcache.xml的缓存策略是怎么定义的?
(3)验证1:EHCache不同cache缓存同一个key第二次是否可以缓存?
(4)验证2:@Cacheable同一个key不同的value是否会缓存?
(5)提问:在value中配置了多个,会是什么情况?

 

 

       接下来看下具体的内容:

1)问题1@Cacheable中的value代表什么?

       看如下代码:

    @Cacheable(value="demo",key="'demoInfo_'+#id")
    @Override
    public DemoInfo findByIdTT(Long id){
       System.err.println("findByIdTT-->没有走缓存!,id="+id);
       return demoInfoRepository.findOne(id);
    }

 

       在使用@Cacheable的时候,有一个配置value,这是是表示什么呢?

value属性表示使用哪个缓存策略,缓存策略在ehcache.xml

 

2)问题2value对应的ehcache.xml的缓存策略是怎么定义的?

       我们看ehcache.xml的定义:

    <cache
       name="demo"  
       eternal="false"
       maxElementsInMemory="100"
       overflowToDisk="false"
       diskPersistent="false"
       timeToIdleSeconds="0"
       timeToLiveSeconds="300"
memoryStoreEvictionPolicy="LRU" />

 

       这个name:缓存对象的名称,那么这个名称有什么作用呢?

       我们可以通过定义不同的name,声明不同的缓存对象:缓存算法、缓存超时时间、缓存最大数目。不同不同的name会创建不同的cache对象。

cache:缓存管理器内可以放置若干cache,存放数据的实质,所有cache都实现了Ehcache接口,这是一个真正使用的缓存实例;通过缓存管理器的模式,可以在单个应用中轻松隔离多个缓存实例,独立服务于不同业务场景需求,缓存数据物理隔离,同时需要时又可共享使用。

       所以从这句话可以看出,在单个应用中多个不同的cache之间是不同的缓存实例。那么对于同一个key,不同的缓存对象缓存信息也就没法生效了。

 

3)验证1EHCache不同cache缓存同一个key第二次是否可以缓存?

       这个代码大家可以自己编写,这里提供一个样例:

    @Test
    public void testEHCache(){
       //此CACHE_NAME、CACHE_NAME2需要在配置文件ehcache.xml 中存在.
       final String CACHE_NAME = "sampleCache1";
       final String CACHE_NAME2 = "sampleCache2";
       String key20 = "person20";
        Person person20 = new Person("person20", 20);
       EHCacheStorage.getInstance().put(CACHE_NAME, key20, person20);
      
       Person p20 = (Person)EHCacheStorage.getInstance().get(CACHE_NAME, key20);
       System.out.println(p20);
       Person p20_2 = (Person)EHCacheStorage.getInstance().get(CACHE_NAME2, key20);
       System.out.println(p20_2);
    }

 

       查看控制台的打印信息:

com.kfit.ehcachedemo.Person@ea1a8d5 //从缓存中获取到对象.

null //未获取到.

 所以不同的cache对象是独立的。

 

4)验证2@Cacheable同一个key不同的value是否会缓存?

       代码如下:

    @Cacheable(value="demo",key="'demoInfo_'+#id")
    @Override
    public DemoInfo findById1(Long id){
       System.err.println("findById1-->没有走缓存!,id="+id);
       return demoInfoRepository.findOne(id);
    }
 
    @Cacheable(value="demoTT",key="'demoInfo_'+#id")
    @Override
    public DemoInfo findByIdTT(Long id){
       System.err.println("findByIdTT-->没有走缓存!,id="+id);
       return demoInfoRepository.findOne(id);
    }

 

       测试代码:

    @RequestMapping("/findById4")
    public String findById4(long id){
       System.out.println("findById4请求-->id="+id);
       System.out.println(demoInfoService.findById1(id));
       System.out.println(demoInfoService.findById1(id));
       System.out.println(demoInfoService.findByIdTT(id));
       return "ok";
    }

 

      

打印信息:

findById4请求-->id=2

findById1-->没有走缓存!,id=2

Hibernate: select demoinfo0_.id as id1_0_0_, demoinfo0_.name as name2_0_0_, demoinfo0_.pwd as pwd3_0_0_, demoinfo0_.state as state4_0_0_ from demo_info demoinfo0_ where demoinfo0_.id=?

DemoInfo [id=2, name=张三, pwd=123456, state=0]

DemoInfo [id=2, name=张三, pwd=123456, state=0]//第二查询就直接从缓存中获取了。

 

findByIdTT-->没有走缓存!,id=2//这个是不同的valu,所以没有走缓存。

DemoInfo [id=2, name=张三, pwd=123456, state=0]

       注意:这里要特别说明的地方,也就是【findByIdTT-->没有走缓存】但是并没有进行select查询打印,这个是为什么,这个就是说到jpa的一级缓存(也叫session缓存),jpa直接从以及缓存中进行获取了,所以没有走数据库查询。(对于一级缓存,不清楚的小盆友,可以自行查资料了解)

 

       那么怎么模拟不走一级缓存呢?很简单,变成两个请求即可,如下:

    @RequestMapping("/findById4_1")
    public String findById4_1(long id){
       System.out.println("findById4_1请求-->id="+id);
       System.out.println(demoInfoService.findById1(id));
       System.out.println(demoInfoService.findById1(id));
       return "ok";
    }
   
    @RequestMapping("/findById4_2")
    public String findById4_2(long id){
       System.out.println("findById4_2请求-->id="+id);
       System.out.println(demoInfoService.findByIdTT(id));
       return "ok";
    }

 

       先访问http://127.0.0.1:8080/findById4_1?id=2

在访问2http://127.0.0.1:8080/findById4_2?id=2

       打印结果如下:

findById4_1请求-->id=2

findById1-->没有走缓存,id=2

Hibernate: select demoinfo0_.id as id1_0_0_, demoinfo0_.name as name2_0_0_, demoinfo0_.pwd as pwd3_0_0_, demoinfo0_.state as state4_0_0_ from demo_info demoinfo0_ where demoinfo0_.id=?

DemoInfo [id=2, name=张三, pwd=123456, state=0]

DemoInfo [id=2, name=张三, pwd=123456, state=0]

 

findById4_2请求-->id=2

findByIdTT-->没有走缓存,id=2

Hibernate: select demoinfo0_.id as id1_0_0_, demoinfo0_.name as name2_0_0_, demoinfo0_.pwd as pwd3_0_0_, demoinfo0_.state as state4_0_0_ from demo_info demoinfo0_ where demoinfo0_.id=?

DemoInfo [id=2, name=张三, pwd=123456, state=0]

       好了,结论已经很明显了,就解答到这里。

 

5)提问:在value中配置了多个,会是什么情况?

       如下代码:

    @Cacheable(value={"demo","demoTT"},key="'demoInfo_'+#id")
    @Override
    public DemoInfo findById1(Long  id){
       System.err.println("findById1-->没有走缓存!,id="+id);
       return demoInfoRepository.findOne(id);
    }

 

       在这里value使用数组配置了多个,那么会是什么结果呢?自己试试吧!

 

 

 

 

 

  • 大小: 14.2 KB
  • 大小: 13.1 KB
分享到:
评论

相关推荐

    37. Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot集成EHCache来实现高效的缓存机制。Spring Boot简化了配置过程,使得我们可以快速地将EHCache引入到我们的应用中,从而提高应用程序的性能,减少对数据库或其他资源的...

    09. Spring Boot缓存技术

    当我们谈论"Spring Boot缓存技术"时,实际上是在讨论如何在Spring Boot应用中有效地管理和利用缓存,以提高系统的性能和响应速度。缓存技术是解决高并发场景下数据访问延迟的有效手段,它通过将常用数据存储在内存中...

    Spring Boot中使用EhCache实现缓存支持

    ### Spring Boot中使用EhCache实现缓存支持 #### 概述 在现代软件开发过程中,缓存技术已经成为提升系统性能的重要手段之一。通过减少对底层数据存储的频繁访问,缓存可以有效缓解数据库压力,加快应用响应速度。...

    Spring+Ehcache集成

    Ehcache作为一款流行的开源缓存解决方案,因其轻量级、高性能和易于集成的特点,常被广泛应用于Spring框架中。本篇文章将详细介绍如何在Spring项目中集成Ehcache,以及如何通过Spring的AOP(面向切面编程)实现方法...

    Spring Boot整合EhCache的步骤详解

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

    SpringBoot 集成Ehcache实现缓存

    ### Spring Boot集成Ehcache实现缓存 #### 一、Ehcache简介 Ehcache是一个高效的纯Java进程内缓存框架,以其快速且轻便的特点而被广泛应用于各种应用场景中,尤其在Java EE和轻量级容器环境中更是受到青睐。...

    springboot+mybatis+ehcache实现缓存数据

    Ehcache是一款高效且易于使用的Java内存缓存框架,对于提升应用程序性能,尤其是在处理大量数据时,能起到显著作用。虽然在分布式场景下Redis可能更为适合,但在单机应用或小型项目中,Ehcache仍然是一个不错的选择...

    Spring Boot缓存实战 EhCache示例

    Spring Boot 缓存实战 EhCache 示例 在本文中,我们将介绍如何使用 EhCache 实现 Spring Boot 缓存。EhCache 是一个流行的开源缓存框架,能够帮助我们提高应用程序的性能。 首先,我们需要在 pom 文件中引入 ...

    springboot2使用ehcache缓存

    5. **测试和验证**:启动Spring Boot应用,通过调用缓存方法观察缓存是否生效。可以使用`@Caching`注解组合多个缓存操作,或者利用`@CacheConfig`为类级别定义共享的缓存配置。 **进一步优化** - **缓存穿透**:...

    spring-boot-cache.rar

    在这个名为 "spring-boot-cache.rar" 的压缩包中,我们很可能是找到了一个基于 Spring Boot 的小型项目,它展示了如何在 Spring Boot 应用中集成和使用缓存功能。下面我们将详细探讨 Spring Boot 缓存的相关知识点。...

    Spring缓存配置

    配置完成后,可以通过单元测试或实际运行应用来验证缓存是否正常工作。可以观察日志,查看缓存的命中率、读写操作等信息,进一步优化缓存策略。 总之,Spring结合EhCache能为我们的Web应用提供高效的缓存解决方案。...

    Spring Boot如何使用EhCache演示

    he: config-location: classpath:ehcache.xml在配置完成后,我们需要在Spring Boot的启动类上添加@EnableCaching注解,激活缓存功能。```java import org.springframework.cache.annotation.EnableCaching; import ...

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

    具体来说,当调用某个被缓存标记的方法时,Spring会检查是否存在与该方法对应的缓存项。如果存在,则直接返回缓存中的结果;若不存在,则执行方法体,并将结果存储在缓存中以便后续请求使用。 #### 启用注解驱动的...

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

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

    ehcache-spring

    而 Spring 框架作为 Java 开发的首选,提供了与 Ehcache 的无缝集成,使得开发者可以方便地在 Spring 应用中使用 Ehcache 进行缓存管理。 **Ehcache 在 Spring 中的配置** 1. **添加依赖**: 在 Maven 项目中,我们...

    Spring4CachingAnnotationsExample

    在本文中,我们将深入探讨如何使用Spring 4的缓存注解来集成EhCache框架。Spring框架提供了强大的缓存抽象,使得开发者可以方便地在应用程序中实现缓存功能,提高性能并降低数据库的负载。EhCache是Spring支持的一个...

    spring-boot-demo19:Spring Boot基础教程 之 使用Caching-EhCache

    Spring Boot简化了配置过程,使得开发者能够快速地启用缓存功能,而EhCache作为一款广泛使用的Java缓存解决方案,提供高效且易用的内存管理。 首先,我们需要理解Spring Boot的缓存抽象。Spring框架提供了基于注解...

Global site tag (gtag.js) - Google Analytics