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

总结

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

相关推荐
码事漫谈8 小时前
多人共用一个 key,缓存命中率会不会因此降低?
后端
考虑考虑9 小时前
docker compose环境变量替换
运维·后端·自动化运维
武雄(小星Ai)10 小时前
飞书API上传26MB文件偶发失败:错误码9499与空响应体排坑实录
后端·api·排坑实录
徐小夕10 小时前
JitWord 4.0 万字分享:从协同工具到AI Word操作系统,聊聊3年产品创业史
前端·vue.js·后端
geovindu12 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
Flynt12 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
IT_陈寒12 小时前
Redis误用keys命令把生产环境搞崩了,血的教训
前端·人工智能·后端
她的男孩13 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
用户83562907805113 小时前
使用 Python 设置 Excel 页眉和页脚
后端·python
步行cgn13 小时前
IoC 控制反转:从概念到 Spring 的实现
后端