首页 > 其他分享 >spring cache 学习 —— @Cacheable 使用详解

spring cache 学习 —— @Cacheable 使用详解

时间:2023-08-25 22:33:45浏览次数:52  
标签:Menu findById Cacheable spring cache 缓存 menu id

spring cache 学习 —— @Cacheable 使用详解

 

1. 功能说明

  @Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。

  注意,这里强调了一点:参数相同。这一点应该是很容易理解的,因为缓存不关心方法的执行逻辑,它能确定的是:对于同一个方法,如果参数相同,那么返回结果也是相同的。但是如果参数不同,缓存只能假设结果是不同的,所以对于同一个方法,你的程序运行过程中,使用了多少种参数组合调用过该方法,理论上就会生成多少个缓存的 key(当然,这些组合的参数指的是与生成 key 相关的)。下面来了解一下 @Cacheable 的一些参数:

 

2. cacheNames & value

  @Cacheable 提供两个参数来指定缓存名:value、cacheNames,二者选其一即可。这是 @Cacheable 最简单的用法示例:

复制代码
@Override
@Cacheable("menu")
public Menu findById(String id) {
Menu menu = this.getById(id);
if (menu != null){
System.out.println("menu.name = " + menu.getName());
}
return menu;
}
复制代码

  在这个例子中,findById 方法与一个名为 menu 的缓存关联起来了。调用该方法时,会检查 menu 缓存,如果缓存中有结果,就不会去执行方法了。

 

3. 关联多个缓存名

  其实,按照官方文档,@Cacheable 支持同一个方法关联多个缓存。这种情况下,当执行方法之前,这些关联的每一个缓存都会被检查,而且只要至少其中一个缓存命中了,那么这个缓存中的值就会被返回。示例:

复制代码
@Override
    @Cacheable({"menu", "menuById"})
    public Menu findById(String id) {
        Menu menu = this.getById(id);
        if (menu != null){
            System.out.println("menu.name = " + menu.getName());
        }
        return menu;
    }

---------
@GetMapping("/findById/{id}")
public Menu findById(@PathVariable("id")String id){
Menu menu0 = menuService.findById("fe278df654adf23cf6687f64d1549c0a");
Menu menu2 = menuService.findById("fb6106721f289ebf0969565fa8361c75");
return menu0;
}
 
复制代码

  为了直观起见,直接将 id 参数写到代码里。现在,我们来测试一下,看一下结果:

    

标签:Menu,findById,Cacheable,spring,cache,缓存,menu,id
From: https://www.cnblogs.com/jinfangwei/p/17658091.html

相关文章

  • spring项目启动报错的处理
    自学spring,之前工程突然间无法启动,控制台有如下错误: ErrorstartingApplicationContext.Todisplaytheconditionsreportre-runyourapplicationwith'debug'enabled.2023-08-2521:24:26.473ERROR1303---[main]o.s.b.d.LoggingFailureAnalysisRepo......
  • Spring Boot 的约定优于配置
    3.首先,约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。4.SpringBoot就是约定优于配置这一理念下的产物,它类似于Spring框架下的一个脚手架,通过SpringBoot,我们可以快速开发基于Spring生态下的......
  • Spring事务源码原理详解(保姆级)
    ✅本文案例源码,基于最新SpringBoot版本2.7.5,Spring版本是5.3.23回顾SpringAOP⭐SpringAOP是Spring中除了依赖注入外(DI)最为核心的功能,AOP即为面向切面编程。⭐SpringAOP通过CGlib和JDK动态代理等方式来实现运行期动态方法增强,目的是将与业务无关的代码单独抽离......
  • 关于SpringBoot中出现的循环依赖问题
    环境:SpringBoot2.7.8背景:在增加出库订单时需要对物品表的的数量进行修改因此我在OutboundController中创建了几个公共方法,并将其注入到Spring中,结果给我报了这一串错误。Description:Thedependenciesofsomeofthebeansintheapplicationcontextfo......
  • 原来你是这样的SpringBoot--Async异步任务
    本节我们一起学习一下SpringBoot中的异步调用,主要用于优化耗时较长的操作,提高系统性能和吞吐量。一、新建项目,启动异步调用首先给启动类增加注解@EnableAsync,支持异步调用@EnableAsync@SpringBootApplicationpublicclassCathySpringbootDemoApplication{publicstat......
  • spring retry
    一、接入springboot2.7.14springretry从2.0.2版本之后,从springbatch里剥离出来成为一个单独的工程,因此我们引入springretry最新版本可以直接如下引入<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><versio......
  • Spring 常用注解
    今天给大家介绍一下Spring中的常用注解,同时这些注解也是Spring中经常用到的注解,下面我们就一起来看看都有哪些注解吧。1.@Controller在控制层使用,标识该类是SpringMVCcontroller处理器,用来创建处理http请求的对象。2.@Service在业务逻辑层使用,用于标注业务层组件。......
  • 在 IDEA 中创建 Spring Boot 项目的方式
    点击左边的SpringInitializr(https://start.spring.io),默认选择你的JDK和构建SpringBoot项目的URL,接着点击右下角的Next尝试阿里云提供的脚手架https://start.aliyun.com,选择Custom,将阿里云的URL复制过去。两个地址官方:https://start.spring.io阿里的:http......
  • LRUCache (least recently used)
     importjava.util.HashMap;importjava.util.LinkedList;importjava.util.Map;/***CachingwiththeLRU(LeastRecentlyUsed)algorithm.**/publicclassLRUCache{privateMap<Object,Object>cache=newHashMap<Object,Object>(......
  • Mongodb数据库基于spring-boot-starter-data-mongodb的查询工具
    /***字段注解*/public@interfaceBuilderField{/***对应的数据库字段名称*@return*/Stringname();}importlombok.SneakyThrows;importjava.io.Serializable;importjava.lang.invoke.SerializedLambda;importjava.lang.reflec......