SpringBoot缓存@Cacheable

SpringBoot 缓存之 @Cacheable介绍 目录 1 概述 2@Cacheable注解使用详细介绍 2.1 @Cacheable注解使用 2.2Cacheable注解的属性 1 概述 Spring高版本引入了cache的注解技术。该技术是一种规范。Redis的cache技术,底层使用的是Spring Data Redis。cache技术的使用需要掌握的有@EnableCaching、@Cacheable、@CacheEvict、@Caching、@CacheConfig注解的使用,这... 阅读详情

一、简介

  1. 缓存介绍
    • Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术。并支持使用 JCache(JSR-107)注解简化我们的开发。
    • 其使用方法和原理都类似于 Spring 对事务管理的支持。Spring Cache 是作用在方法上的,其核心思想是,当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存在缓存中。
  2. Cache 和 CacheManager 接口说明
    • Cache 接口包含缓存的各种操作集合,你操作缓存就是通过这个接口来操作的。
    • Cache 接口下 Spring 提供了各种 xxxCache 的实现,比如:RedisCache、EhCache、ConcurrentMapCache
    • CacheManager 定义了创建、配置、获取、管理和控制多个唯一命名的 Cache。这些 Cache 存在于 CacheManager 的上下文中。

小结

每次调用需要缓存功能的方法时,Spring 会检查指定参数的指定目标方法是否已经被调用过,如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取

注意:本类里调用时会失效
因为@Cacheable等注解实现的功能是通过AOP完成的。

二、@Cacheable 注解使用详细介绍

1、缓存使用步骤

@Cacheable 这个注解,用它就是为了使用缓存的。所以我们可以先说一下缓存的使用步骤

1、开启基于注解的缓存,使用 @EnableCaching 标识在 SpringBoot 的主启动类上。

2、标注缓存注解即可

① 第一步:开启基于注解的缓存,使用 @EnableCaching 标注在 springboot 主启动类上

@SpringBootApplication
@EnableCaching
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }

}

② 第二步:标注缓存注解

// #id的值作为缓存中的key
@Cacheable(cacheNames = "getData", key = "#id")
public String getData(Integer id) {
    System.out.println("查询:" + id);
    return "查询结果";
}

注:这里使用 @Cacheable 注解就可以将运行结果缓存,以后查询相同的数据,直接从缓存中取,返回缓存数据,方法中的代码将不会再执行

2、常用属性说明

下面介绍一下 @Cacheable 这个注解常用的几个属性:

  • cacheNames/value :用来指定缓存组件的名字
  • key :缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值。(这个 key 你可以使用 spEL 表达式来编写)
  • keyGenerator :key 的生成器。 key 和 keyGenerator 二选一使用
  • cacheManager :可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。
  • condition :可以用来指定符合条件的情况下才缓存
  • unless :否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断。(通过 #result 获取方法结果)
  • sync :是否使用异步模式。

① cacheNames

用来指定缓存组件的名字,将方法的返回结果放在哪个缓存中,可以是数组的方式,支持指定多个缓存。

@Cacheable(cacheNames = {"getData1","getData2"})
public String getData(Integer id) {
    System.out.println("查询:" + id);
    return "查询结果";
}

② key

缓存数据时使用的 key。默认使用的是方法参数的值。可以使用 spEL 表达式去编写。

// 设置key为getData[2]
@Cacheable(cacheNames = "getData", key = "#root.methodName + '[' + #id + ']'")
public String getData(Integer id) {
    System.out.println("查询:" + id);
    return "查询结果";
}

③ keyGenerator

key 的生成器,可以自己指定 key 的生成器,通过这个生成器来生成 key。

/**
 * 自定义,按照自己的生成逻辑生成key
 * @return
 */
@Bean("myKeyGenerator")
public KeyGenerator keyGenerator() {
    return new KeyGenerator() {
        @Override
        public Object generate(Object target, Method method, Object... params) {
            return method.getName() + "[" + Arrays.asList(params).toString() + "]";
        }
    };
}

// 使用自己自定义的keyGenerator:myKeyGenerator
@Cacheable(cacheNames = "getData", keyGenerator = "myKeyGenerator")
public String getData(Integer id) {
    System.out.println("查询:" + id);
    return "查询结果";
}

key 和 keyGenerator 使用的时候,一般二选一。

④ condition

符合条件的情况下才缓存。方法返回的数据要不要缓存,可以做一个动态判断。

// id 大于 100 时才会被缓存
@Cacheable(cacheNames = "name1", condition = "#id > 100")
public String getData(Integer id) {
    System.out.println("查询:" + id);
    return "查询结果";
}

⑤ unless

否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。

//  id 大于 100 时就不会被缓存
@Cacheable(cacheNames = "getData", unless = "#id > 100")
public String getData(Integer id) {
    System.out.println("查询:" + id);
    return "查询结果";
}

⑥ sync

是否使用异步模式。默认是方法执行完,以同步的方式将方法返回的结果存在缓存中。

3、spEL 编写 key

缓存的 key 支持使用 spEL 表达式去编写,下面总结一下使用 spEL 去编写 key 可以用的一些元数据:

img

Spring 中的 @Cacheable 缓存注解,你真的了解吗? 第一个问题,首先要搞明白什么是缓存,缓存的意义是什么。对于普通业务,如果要查询一个数据,一般直接select数据库进行查找。但是在高流量的情况下,直接查找数据库就会成为性能的瓶颈。因为数据库查找的流程是先要从磁盘拿到数据,再刷新到内存,再返回数据。磁盘相比于内存来说,速度是很慢的,为了提升性能,就出现了基于内存的缓存。这种基于内存的缓存,由于无法跟磁盘频繁进行存储,所以无法保证数据的完整性,随时有可能丢失,所以架构一般使用数据库加缓存的方式,数据库用来持久化数据,缓存用来处理大流量。 阅读详情

相关推荐

@Cacheable的sync属性

使用缓存的时候需要特别注意:防止缓存并发,并发量比较高的情况下,很可能出现多个请求同时查询1个key的情况,如果我们不加控 制,让这些请求全部穿透到数据库,容易导致数据库挂掉。正常的做法是:只放1个请求去数据库查询数据,其他请求等待(或者立即返回 null),查询数据库的那个线程返回结果后再将数据加入缓存中。 下面我们以ConcurrentMapCache和GuavaCache这2种实现,看下sync的效果 使用ConcurrentMapCache作为缓存实现: sync=false的输出结果: s

6486

@Cacheable注解属性介绍

Spring Boot 学习笔记(三十三):       在 @Cacheable 注解的使用中,共有 9 个属性供我们来使用,这 9 个属性分别是:value、cacheNames、key、keyGenerator、cacheManager、cacheResolver、condition、unless、sync。接下来我们就分别来介绍一下它的使用。 1.value/ca...

扛麻袋的少年的博客 3万+

SpringBoot @Cacheable缓存入门程序

导语 在之前的博客中分享了关于SpringBoot缓存的一些基本的概念,在这篇博客中提供一个小小的入门的实例,通过这个实例可以更好的了解关于SpringBoot缓存有关的知识点。   首先既然是缓存的使用就不得不提及关于缓存的使用场景,在实际的开发中很多的地方都是需要使用到缓存的技术。 1.场景1:和数据库中的数据结构保持一致,原样缓存 2.场景2:列表排序分页场景的缓存 3.场景3:较大的...

初学者 9365

SpringBoot中注解缓存@Cacheable

SpringBoot中注解缓存 @Cacheable 及控制台展示 执行 SQL 查看是否缓存成功 SpringBoot 的maven的项目中,首先在 pom.xml文件中 注入 Spring Boot 缓存支持启动器 及 Ehcache 坐标 <dependency> <groupId>org.springframework.boot</grou...

qq_38845271的博客 4549

SpringBoot缓存@Cacheable注解

可以用来指定符合条件的情况下才缓存,condition默认true,unless默认false,当 condition = false,一定不会缓存;@CacheEvict,当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。Spring Cache是作用在方法上的,当调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存在缓存中。beforeInvocation:非必需,默认为false,会在调用方法之后移除数据。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。

Mr.xing的博客 737

ESP32 TWAI CAN库实战:从零构建CyberGear微电机控制框架

本文详细介绍了如何利用ESP32的TWAI控制器和Arduino环境,从零构建一个面向对象的CyberGear微电机控制框架。该框架将复杂的CAN通信协议封装为简洁的API,开发者无需深究底层细节,即可轻松实现电机的速度、位置和扭矩控制,大幅简化机器人关节、云台等项目的开发流程。

oil88的博客 499

springboot实现redis缓存通过@Cacheable的方式

先说下题外话,昨天看见一篇关于redis缓存的文章一开始没放在心上,因为我也用过redis来做过购物车。

不叫浮云的博客 2853

【头歌实训:逆置顺序表】

根据提示,在右侧编辑器补充函数rev的代码,使用顺序表L的空间就地逆置L。},要求时间复杂度为O(n),空间复杂度为O(1)。第一行为顺序表逆置之前的元素。每个数据后一个空格。第二行为顺序表逆置之后的元素。每个数据后一个空格。本关任务:设计一个算法,将一个顺序表L的元素{a。第一行为顺序表中元素个数n。第二行为空格隔开的n个整数。开始你的任务吧,祝你成功!

guang_Lee的博客 998

springboot缓存——@Cacheable

概念/注解 作用 Cache 缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、 ConcurrentMapCache等 CacheManager 缓存管理器,管理各种缓存(Cache)组件 @Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,以后再获取相同的数据时,直...

只为更懂'你' 1058

PointNetLK实战:5步搞定点云配准(附ModelNet40数据集训练技巧)

本文提供了一份详细的PointNetLK实战指南,帮助读者在5步内掌握点云配准技术。文章以ModelNet40数据集为例,深入讲解了环境搭建、数据预处理、模型训练与调试等核心步骤,并分享了关键的训练技巧和调参策略,旨在让开发者快速实现并应用这一高效的深度学习配准方法。

wind6的博客 462

半导体行业周期分析:库存、需求与复苏路径深度解读

半导体行业作为现代科技产业的基石,其周期性波动受供需关系、库存水平和宏观经济等多重因素影响。从技术原理上看,行业景气度通常通过库存周转天数、晶圆厂产能利用率等核心指标进行监测,这些指标反映了产业链各环节的健康状况。在工程实践中,理解这些指标有助于企业进行库存管理和产能规划,从而提升运营效率。当前,半导体市场正经历结构性分化,其中**库存周转天数**和**晶圆厂产能利用率**成为判断市场拐点的关键。在应用场景上,汽车电子、人工智能等领域需求相对稳健,而消费电子则面临较大压力。本文聚焦于半导体行业的周期特征,探

weixin_29549793的博客 689

SpringBoot 缓存之 @Cacheable 详细介绍

1、缓存使用步骤@Cacheable这个注解,用它就是为了使用缓存的。所以我们可以先说一下缓存的使用步骤:1、开启基于注解的缓存,使用标识在 SpringBoot 的主启动类上。2、标注缓存注解即可① 第一步:开启基于注解的缓存,使用标注在 springboot 主启动类上② 第二步:标注缓存注解注:这里使用@Cacheable注解就可以将运行结果缓存,以后查询相同的数据,直接从缓存中取,不需要调用方法。2、常用属性说明下面介绍一下@Cacheable:用来指定缓存组件的名字key。

2401_83329718的博客 1118

利用gprMax与Matlab实现SFCW雷达信号的高效仿真与优化

本文详细介绍了如何结合gprMax与Matlab实现SFCW雷达信号的高效仿真与优化。通过利用gprMax获取地下场景的冲激响应,并在Matlab中运用卷积与信号处理技术,可大幅提升SFCW雷达系统仿真的效率与灵活性,为探地雷达研究与设计提供强大工具。

book8的博客 706

Springboot 缓存@Cacheable 使用

当第一次调用该方法时,执行方法体并将返回值存入缓存;后续使用「相同参数」调用时,直接从缓存获取结果,无需执行方法体;本质是「方法级缓存」,基于「键值对」存储(键:方法名 + 参数;值:方法返回值);适用场景:查询类方法(如根据 ID 查用户、查商品详情),数据变更频率低、查询频率高。本文记录Springboot 缓存@Cacheable 的引入和使用。

拽着尾巴的鱼儿的博客 1377

别再手动挂载NPU了!手把手教你用Ascend-Docker-Runtime一键启动昇腾AI容器

本文详细介绍了如何使用Ascend-Docker-Runtime一键启动昇腾AI容器,大幅简化NPU设备挂载流程。通过环境变量ASCEND_VISIBLE_DEVICES,开发者可以灵活指定NPU设备,提升开发效率。文章还提供了安装配置指南、高级使用技巧和常见问题排查方法,帮助开发者快速掌握这一高效工具。

weixin_42662605的博客 253

使用 MATLAB/Simulink 对一个开关磁阻电机进行建模

*开关磁阻电机(Switched Reluctance Motor, SRM)**是一种新型的无刷电机,以其简单的机械结构、宽广的调速范围和较高的效率在工业应用中得到了广泛关注。SRM的独特之处在于其定子和转子均为凸极结构,并且通过改变绕组电流的方向来实现转矩的产生和控制。本教程将详细介绍如何使用对一个开关磁阻电机进行建模,并探讨其基本控制策略,特别是针对双凸极结构的SRM。本文介绍了如何使用构建一个开关磁阻电机的双凸极结构模型,并探讨了其基本控制策略。

amy_mhd的博客 203

SpringBoot @Cacheable缓存注解的使用

1. 引入缓存依赖 <!----> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!--这边用的是Red

qq_28834355的博客 1880

笔试题-2023-大疆-数字IC设计【纯净题目版】

笔试题-2023-大疆-数字IC设计【纯净题目版】

w0shishabi的博客 2513

SpringBoot的开启缓存@EnableCaching 和 使用缓存@Cacheable

springboot中的缓存注解支持Spel表达式,因此这里展示常用的SpEL表达式 1、开启缓存 @EnableCaching import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; @SpringBoot

京北游戏官方 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Springboot使用@Cacheable注解实现数据缓存

本文介绍如何在Springboot中通过@Cacheable注解实现数据缓存。在每次调用添加了@Cacheable注解的方法(需要缓存功能的方法)时,Spring 会检查指定参数的指定目标方法是否已经被调用过,如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。

sg_knight的专栏 2684

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Spring Boot缓存@Cacheable

最近一直再学Spring Boot,在学习的过程中也有过很多疑问。为了解答自己的疑惑,也在网上查了一些资料,以下是我对@Cacheable的一些理解。

fly狮子座的博客 334

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SpringBoot 使用 @Cacheable 进行缓存与取值

1. @Cacheable的作用 缓存使用步骤:@Cacheable这个注解,用它就是为了使用缓存的。所以我们可以先说一下缓存的使用步骤: 开启基于注解的缓存,使用 @EnableCaching 标识在 SpringBoot 的主启动类上。 标注缓存注解即可 第一步:开启基于注解的缓存,使用 @EnableCaching 标注在 springboot 主启动类上 //开启基于注解的缓存 @EnableCaching @EnableRyFeignClients @SpringBootApplicat

weixin_42116127的博客 3660

Spring Boot中的缓存注解@Cacheable,@CachePut,@CacheEvict 的作用及用法。

在 Spring Boot 中,缓存是非常重要的。通过使用缓存注解,可以方便地实现缓存功能,提高程序的性能。在代码中,我们可以通过使用 @Cacheable、@CachePut、@CacheEvict 注解来开启缓存功能,也可以通过配置文件来配置缓存属性。

YoungJIA977的博客 1309

SpringBoot 缓存之 @Cacheable使用示例

启动类在加上注解@EnableCaching开启缓存注解,主要适用于整个接口返回结果需要缓存的场景,其他情况,由于业务场景比较复杂,也就是单独某段代码需要缓存,使用redis的客户端会更加灵活。@Cacheable的cacheNames可以理解为缓存key的前缀或者一级目录(redis可视化工具下)。 引入依赖: <dependency> <groupId>org.springframework.boot</groupId&g...

meser88的博客 2749

SpringBoot 缓存管理 @EnableCaching、@Cacheable

SpringBoot缓存管理一、SpringBoot缓存管理1、pom文件添加依赖2、@EnableCaching开启缓存管理。3、注册缓存管理Bean。4、@Cacheable使用缓存。二、集成redis5、添加redis配置6、修改cacheManager7、查看redis进行验证:三、注解使用事项1、@Cacheable2、@CachePut3、@CacheEvict4、@Caching 本文章介绍SpringBoot集成redis缓存管理。 一、SpringBoot缓存管理 1、pom文件添加依赖

隔壁老王呀的专栏 1918
上一篇: EasyExcel导出文件格式不匹配
下一篇: PostgreSQL的视图以及物化视图的特点
睡、不辜负床
博客等级 码龄7年 9粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值