当前位置: 首页 > news >正文

Spring cache的使用

Spring Cache是Spring提供的一个缓存框架,基于AOP原理,实现了基于注解的缓存功能,只需要简单地加一个注解就能实现缓存功能,对业务代码的侵入性很小。

1. 常用的 Spring Cache 注解

  • @EnableCaching:开启缓存功能。
  • @Cacheable:将方法返回值缓存,适用于读取操作。
  • @CacheEvict:清除缓存,常用于删除或更新数据时。
  • @CachePut:每次调用方法时都将返回值缓存,适用于更新缓存。
  • @Caching:组合多个缓存注解,以便同时执行多个缓存操作。
  • @CacheConfig:用于配置类的统一缓存配置,如指定缓存的名称等。

2. Spring Cache 的使用

2.1 引入依赖

在使用 Spring Cache 之前,需要在项目的 pom.xml 中引入相关依赖(例如,使用 Redis 作为缓存时需引入 Spring Data Redis 的依赖)。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.2 启用缓存功能

在 Spring Boot 应用的启动类上添加 @EnableCaching 注解,开启缓存支持。

@SpringBootApplication
@EnableCaching
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

2.3 配置缓存管理器

使用 Redis 作为缓存时,可以通过配置类来定义 CacheManager。例如:

@Configuration
public class CacheConfig {@Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(60))  // 设置缓存有效期.disableCachingNullValues();  // 不缓存null值return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build();}
}

2.4 在业务方法中使用缓存注解

在业务逻辑中,通过注解来声明需要缓存的操作。

2.4.1 @Cacheable

适用于查询操作,若缓存中已有数据则返回缓存数据,若没有则执行方法并将结果缓存。

@Cacheable(value = "users", key = "#userId")
public User getUserById(String userId) {// 模拟从数据库获取用户信息return userRepository.findById(userId).orElse(null);
}

Cacheable注解配置的两项参数说明:

value:缓存的名称,缓存名称作为缓存key的前缀。

key: 缓存key,支持SpEL表达式,上述代码表示取参数id的值作为key

最终缓存key为:缓存名称+“::”+key,例如:上述代码id为123,最终的key为:JZ_CACHE:SERVE_RECORD::123

SpEL(Spring Expression Language)是一种在 Spring 框架中用于处理字符串表达式的强大工具,它可以实现获取对象的属性,调用对象的方法操作。

keyGenerator:指定一个自定义的键生成器(实现 org.springframework.cache.interceptor.KeyGenerator 接口的类),用于生成缓存的键。与 key 属性互斥,二者只能选其一。

cacheManager:表示缓存管理器,通过缓存管理器可以设置缓存过期时间。

2.4.2 @CacheEvict

适用于删除缓存操作。例如,当更新或删除某个数据时,清除相应的缓存。

@CacheEvict(value = "users", key = "#userId")
public void deleteUserById(String userId) {userRepository.deleteById(userId);
}

2.4.3 @CachePut

适用于更新缓存数据,每次调用方法时都将更新缓存

@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {return userRepository.save(user);
}

3. Spring Cache 的工作原理

3.1 基于 AOP

Spring Cache 是基于 Spring 的 AOP 原理实现的。在执行被缓存的方法之前,代理对象会先检查缓存中是否已经有数据,如果有则直接返回缓存数据,不再执行方法。

3.2 缓存存储和管理

如果缓存中没有数据,则调用实际方法执行,并将方法的返回值存储到缓存中,供下次调用时使用。

3.3 注解作用

通过注解(如 @Cacheable 等),开发者无需显式地编写缓存逻辑,Spring Cache 自动处理缓存的存取和失效操作。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 锐捷交换机常用命令
  • 【阿里千问最新多模态模型】Qwen2-VL:让世界看得更清晰
  • iText2KG:显著降低LLM构建知识图谱时的幻觉现象
  • React第五章(swc)
  • npm i:【idealTree:vue.web: sill idealTree buildDeps vue3拉取jQuery卡慢失败:[解决]】
  • LabVIEW如何确保采集卡稳定运行
  • Linux 磁盘扩容操作指引
  • 深入CSS 布局——WEB开发系列29
  • 【JavaSE】重写equals()和hashCode()
  • 2409wtl,网浏包装
  • 程序员如何写笔记?
  • 软件开发人员从0到1实现物联网项目:项目架构的思考
  • 基于聚类与LSTM对比特币价格深度分析与预测
  • 开机自动启动nginx
  • 【无人机设计与控制】 四轴飞行器的位移控制
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • const let
  • egg(89)--egg之redis的发布和订阅
  • ES6之路之模块详解
  • in typeof instanceof ===这些运算符有什么作用
  • Java 网络编程(2):UDP 的使用
  • JavaScript新鲜事·第5期
  • Nodejs和JavaWeb协助开发
  • 分类模型——Logistics Regression
  • 浮现式设计
  • 欢迎参加第二届中国游戏开发者大会
  • 今年的LC3大会没了?
  • 开源SQL-on-Hadoop系统一览
  • 力扣(LeetCode)22
  • 模型微调
  • 前端攻城师
  • 7行Python代码的人脸识别
  • Java总结 - String - 这篇请使劲喷我
  • 阿里云重庆大学大数据训练营落地分享
  • ​flutter 代码混淆
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (C#)一个最简单的链表类
  • (C语言)fread与fwrite详解
  • (day6) 319. 灯泡开关
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (十二)Flink Table API
  • (原创)可支持最大高度的NestedScrollView
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)平衡树
  • .jks文件(JAVA KeyStore)
  • .net core 6 集成和使用 mongodb
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 中使用 Mutex 进行跨越进程边界的同步