SpringBoot如何实现缓存预热?

ops/2024/12/24 10:21:42/

缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。

那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系统呢?

实现方案概述

在 Spring Boot 启动之后,可以通过以下手段实现缓存预热:

1、使用启动监听事件实现缓存预热。
2、使用 @PostConstruct 注解实现缓存预热。
3、使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热。
4、通过实现 InitializingBean 接口,并重写 afterPropertiesSet 方法实现缓存预热。

具体实现方案

① 启动监听事件
可以使用 ApplicationListener 监听 ContextRefreshedEvent 或 ApplicationReadyEvent 等应用上下文初始化完成事件,在这些事件触发后执行数据加载到缓存的操作,具体实现如下:

java">@Component
public class CacheWarmer implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {// 执行缓存预热业务...cacheManager.put("key", dataList);}
}

或监听 ApplicationReadyEvent 事件,如下代码所示:

java">@Component
public class CacheWarmer implements ApplicationListener<ApplicationReadyEvent> {@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {// 执行缓存预热业务...cacheManager.put("key", dataList);}
}

② @PostConstruct 注解
在需要进行缓存预热的类上添加 @Component 注解,并在其方法中添加 @PostConstruct 注解和缓存预热的业务逻辑,具体实现代码如下:

java">@Component
public class CachePreloader {@Autowiredprivate YourCacheManager cacheManager;@PostConstructpublic void preloadCache() {// 执行缓存预热业务...cacheManager.put("key", dataList);}
}

③ CommandLineRunner或ApplicationRunner
CommandLineRunner 和 ApplicationRunner 都是 Spring Boot 应用程序启动后要执行的接口,它们都允许我们在应用启动后执行一些自定义的初始化逻辑,例如缓存预热。CommandLineRunner 实现示例如下:

java">@Component
public class MyCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {// 执行缓存预热业务...cacheManager.put("key", dataList);}
}

ApplicationRunner 实现示例如下:

java">@Component
public class MyApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {// 执行缓存预热业务...cacheManager.put("key", dataList);}
}

CommandLineRunner 和 ApplicationRunner 区别如下:

1、方法签名不同:
CommandLineRunner 接口有一个 run(String… args) 方法,它接收命令行参数作为可变长度字符串数组。
ApplicationRunner 接口则提供了一个 run(ApplicationArguments args) 方法,它接收一个 ApplicationArguments 对象作为参数,这个对象提供了对传入的所有命令行参数(包括选项和非选项参数)的访问。
2、参数解析方式不同:
CommandLineRunner 接口更简单直接,适合处理简单的命令行参数。
ApplicationRunner 接口提供了一种更强大的参数解析能力,可以通过 ApplicationArguments 获取详细的参数信息,比如获取选项参数及其值、非选项参数列表以及查询是否存在特定参数等。
3、使用场景不同:
当只需要处理一组简单的命令行参数时,可以使用 CommandLineRunner。
对于需要精细控制和解析命令行参数的复杂场景,推荐使用 ApplicationRunner。

④ 实现InitializingBean接口
实现 InitializingBean 接口并重写 afterPropertiesSet 方法,可以在 Spring Bean 初始化完成后执行缓存预热,具体实现代码如下:

java">@Component
public class CachePreloader implements InitializingBean {@Autowiredprivate YourCacheManager cacheManager;@Overridepublic void afterPropertiesSet() throws Exception {// 执行缓存预热业务...cacheManager.put("key", dataList);}
}

在这里插入图片描述

小结

缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。它可以通过监听 ContextRefreshedEvent 或 ApplicationReadyEvent 启动事件,或使用 @PostConstruct 注解,或实现 CommandLineRunner 接口、ApplicationRunner 接口,和 InitializingBean 接口的方式来完成。

课后思考

以上四种缓存预热方法的执行先后顺序是怎么样的?为什么?


http://www.ppmy.cn/ops/144541.html

相关文章

轻量级+鲸鱼优化!WOA-LightGBM鲸鱼优化算法优化轻量级梯度提升机分类预测Matlab实现

轻量级鲸鱼优化&#xff01;WOA-LightGBM鲸鱼优化算法优化轻量级梯度提升机分类预测Matlab实现 目录 轻量级鲸鱼优化&#xff01;WOA-LightGBM鲸鱼优化算法优化轻量级梯度提升机分类预测Matlab实现分类效果基本描述程序设计参考资料 分类效果 未优化运行效果 基本描述 1.…

easegen将教材批量生成可控ppt课件方案设计

之前客户提出过一个需求&#xff0c;就是希望可以将一本教材&#xff0c;快速的转换为教学ppt&#xff0c;虽然通过人工程序脚本的方式&#xff0c;已经实现了该功能&#xff0c;但是因为没有做到通用&#xff0c;每次都需要修改脚本&#xff0c;无法让客户自行完成所有流程&am…

Kotlin学习-内置基本类型

课程内容&#xff1a;3-1内置类型-基本类型 声明变量val b: String "Hello World"声明一个字符类型变量 类型String写在变量名&#xff0c;后面是为了类型推导因为有了类型推导&#xff0c;可以省略String类型的显示声明 不允许类型隐式转换&#xff0c;不同类型之…

pyparsing如何实现嵌套捕获

在 pyparsing 中&#xff0c;嵌套捕获可以通过递归定义解析规则来实现。以下是实现嵌套捕获的一些关键步骤&#xff1a; 定义基础规则&#xff1a;定义一个解析器&#xff0c;用于捕获最基本的元素。递归引用解析器&#xff1a;使用 Forward 创建一个占位符解析器&#xff0c;…

动手学深度学习11.2. 凸性-笔记练习(PyTorch)

本节课程地址&#xff1a;72 优化算法【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;11.2. 凸性 — 动手学深度学习 2.0.0 documentation 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-perceptrons>convexity.ipynb 凸性 …

JS中的原型与原型链

1. 基本概念 原型&#xff08;Prototype&#xff09;&#xff1a;每个对象都有一个内部属性 [[Prototype]]&#xff0c;通常通过 __proto__ 访问&#xff08;非标准&#xff0c;但广泛支持&#xff09;。 原型链&#xff08;Prototype Chain&#xff09;&#xff1a;对象通过原…

ShardingSphere分库分表

ShardingSphere 高性能架构模式 读写分离架构&#xff1a; 基本原理是将数据库读写操作分散到不同的节点上&#xff0c;主库负责处理事务性的增删改操作&#xff0c;从库负责处理查询操作。避免由数据更新导致的行锁&#xff0c;来提升性能。 一主一从&#xff1a;可以将查…

【数据安全】如何保证其安全

数据安全风险 数字经济时代&#xff0c;数据已成为重要的生产要素。智慧城市、智慧政务的建设&#xff0c;正以数据为核心&#xff0c;推动城市管理的智能化和公共服务的优化。然而&#xff0c;公共数据开放共享与隐私保护之间的矛盾日益凸显&#xff0c;如何在确保数据安全的…