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

总结

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

相关推荐
Java中文社群12 分钟前
炸裂:SpringAI新版发布,终于支持断线重连了!
java·后端·ai编程
哈喽姥爷32 分钟前
Spring Boot--Bean的扫描和注册
java·spring boot·后端·bean的扫描和注册
problc33 分钟前
Spring Boot `@Service` 互相调用全攻略:`@Autowired` vs `@Resource`
java·spring boot·后端
文心快码BaiduComate1 小时前
文心快码3.5S全新升级,体验多智能体协同开发,最高赢无人机!
前端·后端·程序员
就是帅我不改2 小时前
10万QPS压垮系统?老司机一招线程池优化,让性能飞起来!
后端·面试·github
uzong2 小时前
系统稳定性保障:研发规约V1.0
后端
Ray662 小时前
log4j2.xml配置文件详解
后端
Frank_zhou2 小时前
Easy-Es 架构设计详解
后端·elasticsearch
狗头大军之江苏分军2 小时前
Meta万人裁员亲历者自述:小扎尝到了降本的甜头
前端·后端·github
Jagger_2 小时前
SonarQube:提升代码质量的前后端解决方案
前端·后端·ai编程