首页 > 其他分享 >SpringBoot 缓存之 @Cacheable 详细介绍

SpringBoot 缓存之 @Cacheable 详细介绍

时间:2023-10-18 10:46:10浏览次数:40  
标签:缓存 SpringBoot Cache Cacheable key 注解 方法

简介
缓存介绍
Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术。并支持使用 JCache(JSR-107)注解简化我们的开发。

其使用方法和原理都类似于 Spring 对事务管理的支持。Spring Cache 是作用在方法上的,其核心思想是,当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存在缓存中。

Cache 和 CacheManager 接口说明
Cache 接口包含缓存的各种操作集合,你操作缓存就是通过这个接口来操作的。

Cache 接口下 Spring 提供了各种 xxxCache 的实现,比如:RedisCache、EhCache、ConcurrentMapCache

CacheManager 定义了创建、配置、获取、管理和控制多个唯一命名的 Cache。这些 Cache 存在于 CacheManager 的上下文中。

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

依赖与配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
1
2
3
4
spring:
redis:
host: localhost
port: 6379
jedis:
pool:
max-active: 8
max-idle: 8
max-wait: -1s
password:
database: 6
cache:
type: redis
1
2
3
4
5
6
7
8
9
10
11
12
13
@Cacheable 注解使用详细介绍
缓存使用步骤
@Cacheable这个注解,是org.springframework.cache.annotation.Cacheable包下的注解,缓存的使用步骤:

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

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

 

② 第二步:标注缓存注解

如果标记在类上表示所有方法都支持缓存,如果标记在方法上表示该方法支持缓存


注:这里使用 @Cacheable 注解就可以将运行结果缓存,以后查询相同的数据,直接从缓存中取,不需要调用方法。

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

cacheNames/value :用来指定缓存组件的名字

key :缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值。(这个 key 你可以使用 spEL 表达式来编写)

keyGenerator :key 的生成器。 key 和 keyGenerator 二选一使用

cacheManager :可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。

condition :可以用来指定符合条件的情况下才缓存

unless :否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断。(通过 #result 获取方法结果),condition 比 unless 的优先级高

sync :是否使用异步模式。

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

 

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

 

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

 

 

这样放入缓存中的 key 的生成规则就按照你自定义的 keyGenerator 来生成。不过需要注意的是:

@Cacheable的属性,key 和 keyGenerator 使用的时候,一般二选一。

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

 

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

 

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

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

 


————————————————
版权声明:本文为CSDN博主「笼中小夜莺」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_46521785/article/details/121654533

标签:缓存,SpringBoot,Cache,Cacheable,key,注解,方法
From: https://www.cnblogs.com/xd502djj/p/17771502.html

相关文章

  • MESI缓存一致性协议以及Volatile
    MESI(Modified,Exclusive,Shared,Invalid)是一种缓存一致性协议,用于解决多处理器系统中,多个处理器对同一块内存的并发读写可能导致的数据不一致性问题。MESI协议维护了每个缓存行的四种状态:Modified(M):表示缓存行已被修改,并且是唯一的拷贝。当其他处理器需要读取该数据时,必须先......
  • springboot连接rabbitmq网络异常时,不能自动重连的问题
    在rabbitmq官网的javaapi处:https://www.rabbitmq.com/api-guide.html#recovery介绍了java连接rabbitmq异常恢复的问题。其中提及了如下内容Asofversion4.0.0oftheJavaclient,automaticrecoveryisenabledbydefault(andthustopologyrecoveryaswell).也就是......
  • Springboot实现模糊查询
    合理怀疑我之前的脑子长歪了,就跟个小丑一样,到处蹦跶,也没解决,现在好像走了大运,就直接出结果了具体实现我跟之前的sql语句进行对比,发现在我印象里面我使用的是这种结构:select*fromuserwhereidlikecaoncat('%',#{id},'%');但是记忆好像出现了问题,它实际上是这样的:select......
  • springboot访问图片本地路径并映射成url
    这几天很头疼,vue不读取图片,src已经动态绑定了,还是访问不到vue本地下图片,于是我就把图片地址改为springboot本地就成功了。 下面是参考博客;springboot访问图片本地路径并映射成url_springboot配置图片访问路径-CSDN博客最后样式 ......
  • SpringBoot 操作 达梦数据库
    SpringBoot操作达梦数据库 一、前提条件本篇博客以访问本地达梦数据库(DM8)为基础进行演示。(前提:本地已经安装了DM8数据库!)关于Windows安装达梦数据库,请参考博客:Windows安装达梦数据库关于Docker安装达梦数据库,请参考博客:Docker安装达梦数据库关于JDBC方式操作......
  • SpringBoot2,Druid数据源常用配置
    spring:datasource:druid:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/mybatis?serverTimeZone=UTCusername:rootpassword:rootmax-wait:2000#获取连接的最大等待时间initial-size:5......
  • SpringBoot启动流程源码分析(2)
    1、启动引导类大部分时候,SpringBoot应用主要通过在引导类调用SpringApplication的静态run方法启动,同时将引导类注册为配置源。比如下面是一个SpringMVC的Web应用,引导类是WebMVCBootstrap,和命令行参数args作为SpringApplication静态run方法的参数,用于构建SpringApplication对象和......
  • SpringBoot 03 Shiro
    shiro是apache的一个开源框架,是一个权限管理的框架,实现认证、授权、加密、会话管理。shiro优势举例易用:相当于其他安全框架,shiro比较简单易用。使用非常广泛,资料好找。灵活:可以工作在很多环境。web支持:对web的支持好,如thymeleaf标签支持。支持:应用广泛,是Apache软件基......
  • SpringBoot 02 shiro框架查询用户权限与角色
      实体类 @Data@AllArgsConstructor@NoArgsConstructor@TableName("t_user")publicclassRUser{@TableId(value="id",type=IdType.AUTO)privateIntegerusrId;privateStringusrName;privateStringusrAccount;pri......
  • SpringBoot应用jar包启动原理详解
    1、maven打包SpringBoot项目的pom.xml文件中默认使用spring-boot-maven-plugin插件进行打包:<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId>&l......