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方法之前执行初始化;

总结

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

相关推荐
henujolly8 分钟前
go学习day two
后端
AI袋鼠帝21 分钟前
腾讯这只小程序Agent🦀,帮我找到了最强日程、文件、知识管理姿势
后端
努力的小郑29 分钟前
突发!Claude Code 51万行源码全网裸奔:一场史诗级“开源”事故,国内大厂笑麻了
前端·后端·ai编程
HashTang1 小时前
Claude Code 源码中 REPL.tsx 深度解析:一个 5005 行 React 组件的架构启示
前端·后端·ai编程
thatway19891 小时前
ARM TFM-1介绍及代码下载运行适配
后端
千寻girling2 小时前
不知道 Java 全栈 + AI 编程有没有搞头 ?
前端·人工智能·后端
小码哥_常2 小时前
Spring Boot 实现网络限速:让流量“收放自如”
后端
johnrui3 小时前
SpringBoot-JdbcTemplate
java·spring boot·后端
Victor3564 小时前
MongoDB(72)如何创建用户和角色?
后端
Victor3564 小时前
MongoDB(71)如何启用MongoDB身份验证?
后端