Spring Boot的缓存预热如何实现

前言

在日常开发过程中,我们需要在启动的时候加载一些项目运行中使用比较频繁的数据,为了避免在项目中频繁的查询数据库,给DB造成压力,需要将这些字典数据提前加载到缓存,这样在业务逻辑调用的时候,可以直接从缓存中获取数据;但是我需要在项目一启动的时候,就进行加载,就是缓存预热,让我们一起来研究下Spring boot是如何进行缓存预热的;

缓存预热几种方式

事件监听

第一种方式就是事件的监听,通过ApplicationReadyEvent,在应用程序启动的时候可以通过监听应用启动事件,将需要加载的缓存数据加载到缓存中;

让我们先来看下这个类的实现,ApplicationReadyEvent继承SpringApplicationEvent是Spring应用启动的时候一个监听器,看它构造方法有个SpringApplication,这个类是Java主方法和Spring应用程序启动的核心类;

在我们Spring boot项目的application启动类里面有个SpringApplication.run方法就是进行应用启动,还是回到ApplicationReadyEvent是Spring Boot框架中的一个事件类,基于事件我们可以在程序初始化的时候,通过监听这个类完成跟随着主程序的初始化,一起进行缓存预热;

通过EventListener注解监听ApplicationReadyEvent类;

通过启动项目可以看到,在进行上下文刷新的时候,监听配置文件的时候,断点就进来了,这时候可以在这个configuration配置类里面写缓存预热逻辑;

CommandLineRunner

还有一个方法是实现CommandLineRunner接口,在项目启动的时候,通过@Component注解,在run方法里写缓存预热的业务逻辑;

可以通过写内部类,实现多个CommandLineRunner接口,定义order先后加载顺序完成缓存预热;

ApplicationRunner

和CommandLineRunner也是一样的逻辑,实现ApplicationRunner接口,重写run方法,两者肯定是有区别;

  • CommandLineRunner 入参:先看CommandLineRunner的入参数String... args 类型:字符串,项目启动执行的命令参数 执行:ApplicationRunner之前执行

  • ApplicationRunner 入参:ApplicationArguments 类型:项目启动更高级别的参数 执行:CommandLineRunner之后执行

  • 执行场景区别 CommandLineRunner更加适合一些简单的场景数据初始化、缓存预热, 而ApplicationRunner可以用来初始化一些应用配置

Spring的InitializingBean

了解Spring的伙伴都知道,在bean的初始化的时候通过InitializingBean的afterPropertiesSet方法在Init-method方法之前执行初始化;

总结

这边介绍了几种在项目启动的时候,需要对数据进行预热的几种方式,可以根据预热数据的类型,使用不同的接口进行实现,当然也需要合理使用,如果加载的数据过多,会造成项目启动很慢,可以将一部分优先使用到的数据进行加载,等待项目启动完成运行中在进行另外一部分的加载;

相关推荐
孪生质数-几秒前
SQL server 2022和SSMS的使用案例1
网络·数据库·后端·科技·架构
uhakadotcom4 分钟前
AWS Lightsail 简介与实践
后端·面试·github
程序员鱼皮1 小时前
2025最新 Java 面经:美团后端面试真实复盘,附答案模板,速速收藏!
java·后端·面试
有来技术1 小时前
从0到1手撸企业级权限系统:基于 youlai-boot(开源) + Java17 + Spring Boot 3 完整实战
java·spring boot·后端
陈明勇2 小时前
一文掌握 MCP 上下文协议:从理论到实践
人工智能·后端·mcp
SimonKing2 小时前
因为不知道条件注解@Conditional,错失15K的Offer!
java·后端·架构
橘猫云计算机设计2 小时前
基于springboot微信小程序的旅游攻略系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·微信小程序·毕业设计·旅游
雷渊2 小时前
spring-IoC容器启动流程源码分析
java·后端·面试
用户3315489111072 小时前
一招搞定Java线程池炸弹,系统吞吐量暴增10倍!
java·后端