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

总结

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

相关推荐
それども10 分钟前
Spring Bean 的name可以相同吗
java·后端·spring
上进小菜猪12 分钟前
基于深度学习的农业虫害自动识别系统:YOLOv8 的完整工程
后端
FAQEW1 小时前
若依(RuoYi-Vue)单体架构实战手册:自定义业务模块全流程开发指南
前端·后端·架构·若依二开
a努力。2 小时前
美团Java面试被问:Redis集群模式的工作原理
java·redis·后端·面试
计算机程序设计小李同学3 小时前
动漫之家系统设计与实现
java·spring boot·后端·web安全
布列瑟农的星空3 小时前
SSE与流式传输(Streamable HTTP)
前端·后端
开心就好20253 小时前
使用 HBuilder 上架 iOS 应用时常见的问题与应对方式
后端
开心猴爷3 小时前
Swift IPA 混淆在工程实践中的方式,分析仅依赖源码层混淆的局限性
后端
用户4099322502124 小时前
Vue3 v-if与v-show:销毁还是隐藏,如何抉择?
前端·vue.js·后端
黄俊懿4 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——全局事务的回滚
java·后端·spring·spring cloud·微服务·架构·架构师