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

springboot 缓存预热的几种方案

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

这里我给大家总结几个缓存预热的方案。

方案1:使用启动监听事件实现缓存预热

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

监听 ContextRefreshedEvent事件

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

或监听 ApplicationReadyEvent 事件

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

方案2:使用 @PostConstruct 注解实现缓存预热

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

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

方案3:使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热

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

CommandLineRunner 实现:

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

ApplicationRunner 实现示例:

@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。

方案4:通过实现 InitializingBean 接口,并重写 afterPropertiesSet 方法实现缓存预热

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

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

总结

  1. 使用启动监听事件实现缓存预热
    优点:可以在应用完全启动之前执行,可以确保缓存预热在所有依赖初始化完成之后进行。
    缺点:处理复杂,需要对Spring的事件机制有一定了解。
  2. 使用@PostConstruct注解实现缓存预热
    优点:简单易用,不需要额外的接口实现,适用于简单的预热逻辑。
    缺点:对于复杂的预热逻辑,可能会导致方法变得臃肿,不易于维护。
  3. 使用CommandLineRunner或ApplicationRunner实现缓存预热
    优点:非常灵活,适合处理复杂的预热逻辑,可以接受参数,易于测试和扩展。
    缺点:可能不如@PostConstruct直观,对于非常简单的预热逻辑可能显得有些过度设计。
  4. 通过实现InitializingBean接口,并重写afterPropertiesSet方法实现缓存预热
    优点:这是Spring推荐的方式之一,保证了bean的生命周期管理,适合需要在属性注入完毕后进行初始化的场景。
    缺点:对于非Spring Bean的类不适用,且对于简单的预热逻辑,可能会觉得有些繁琐。

推荐:

  1. 如果你的预热逻辑较为简单,且希望保持代码简洁,推荐@PostConstruct注解。
  2. 对于更复杂的情况,尤其是需要接收参数或执行更复杂的业务逻辑时,使用CommandLineRunner或ApplicationRunner会更加合适,它提供了更多的灵活性和控制。
  3. 如果你正在处理的是一个Spring Bean,并且需要在属性注入完成后执行预热逻辑,那么实现InitializingBean接口是标准且推荐的做法。

所以比较推荐后两种方案。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 科技云报道:算网筑基AI注智,中国联通如何讲出AI时代的“新故事”?
  • 《MySQL DBA 修炼之道》第二章 Mysql目录结构及bin目录下的文件含义
  • Nacos-2.4.0最新版本docker镜像,本人亲自制作,部署十分方便,兼容postgresql最新版本17和16,奉献给大家了
  • 4 Go语言的操作符
  • Qt 实战(3)数据类型 | 3.2、QVariant
  • 梯度消失和梯度爆炸
  • 前端开发知识(二)-css
  • 分布式系列之ID生成器
  • DockerCompose 安装环境
  • 10道JVM经典面试题
  • 时间序列预测 — — ARIMA模型(理论分析与代码详解)
  • lua 写一个 不同时区之间转换日期和时间 函数
  • qt 如何制作动态库插件
  • SSH不用每次都输入密码的方法
  • Angular由一个bug说起之八:实践中遇到的一个数据颗粒度的问题
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • happypack两次报错的问题
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript函数式编程(一)
  • Linux各目录及每个目录的详细介绍
  • python学习笔记 - ThreadLocal
  • 给新手的新浪微博 SDK 集成教程【一】
  • 观察者模式实现非直接耦合
  • 入手阿里云新服务器的部署NODE
  • 微信支付JSAPI,实测!终极方案
  • 我的业余项目总结
  • Android开发者必备:推荐一款助力开发的开源APP
  • 阿里云服务器购买完整流程
  • ​Java基础复习笔记 第16章:网络编程
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #HarmonyOS:基础语法
  • #Lua:Lua调用C++生成的DLL库
  • $GOPATH/go.mod exists but should not goland
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (12)Hive调优——count distinct去重优化
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (ibm)Java 语言的 XPath API
  • (k8s)Kubernetes本地存储接入
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (python)数据结构---字典
  • (初研) Sentence-embedding fine-tune notebook
  • (独孤九剑)--文件系统
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (力扣)1314.矩阵区域和
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (七)Activiti-modeler中文支持
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (转)项目管理杂谈-我所期望的新人
  • (转载)从 Java 代码到 Java 堆
  • ****Linux下Mysql的安装和配置
  • .NET 8 跨平台高性能边缘采集网关
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Framework 3.5安装教程
  • .NET 中 GetProcess 相关方法的性能