面试官:SpringBoot如何实现缓存预热?

简介: 面试官:SpringBoot如何实现缓存预热?

缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。

那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系统呢?

实现方案概述

在 Spring Boot 启动之后,可以通过以下手段实现缓存预热:

  1. 使用启动监听事件实现缓存预热。
  2. 使用 @PostConstruct 注解实现缓存预热。
  3. 使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热。
  4. 通过实现 InitializingBean 接口,并重写 afterPropertiesSet 方法实现缓存预热。

    具体实现方案

    ① 启动监听事件

    可以使用 ApplicationListener 监听 ContextRefreshedEvent 或 ApplicationReadyEvent 等应用上下文初始化完成事件,在这些事件触发后执行数据加载到缓存的操作,具体实现如下:

    @Component
    public class CacheWarmer implements ApplicationListener<ContextRefreshedEvent> {
         
     @Override
     public void onApplicationEvent(ContextRefreshedEvent event) {
         
         // 执行缓存预热业务...
         cacheManager.put("key", dataList);
     }
    }
    

    或监听 ApplicationReadyEvent 事件,如下代码所示:

    @Component
    public class CacheWarmer implements ApplicationListener<ApplicationReadyEvent> {
         
     @Override
     public void onApplicationEvent(ApplicationReadyEvent event) {
         
         // 执行缓存预热业务...
         cacheManager.put("key", dataList);
     }
    }
    

    ② @PostConstruct 注解

    在需要进行缓存预热的类上添加 @Component 注解,并在其方法中添加 @PostConstruct 注解和缓存预热的业务逻辑,具体实现代码如下:

    @Component
    public class CachePreloader {
         
    
     @Autowired
     private YourCacheManager cacheManager;
    
     @PostConstruct
     public void preloadCache() {
         
         // 执行缓存预热业务...
         cacheManager.put("key", dataList);
     }
    }
    

    ③ CommandLineRunner或ApplicationRunner

    CommandLineRunner 和 ApplicationRunner 都是 Spring Boot 应用程序启动后要执行的接口,它们都允许我们在应用启动后执行一些自定义的初始化逻辑,例如缓存预热。
    CommandLineRunner 实现示例如下:

    @Component
    public class MyCommandLineRunner implements CommandLineRunner {
         
     @Override
     public void run(String... args) throws Exception {
         
         // 执行缓存预热业务...
         cacheManager.put("key", dataList);
     }
    }
    

    ApplicationRunner 实现示例如下:

    @Component
    public class MyApplicationRunner implements ApplicationRunner {
         
     @Override
     public void run(ApplicationArguments args) throws Exception {
         
         // 执行缓存预热业务...
         cacheManager.put("key", dataList);
     }
    }
    

    CommandLineRunner 和 ApplicationRunner 区别如下:

  5. 方法签名不同

    • CommandLineRunner 接口有一个 run(String... args) 方法,它接收命令行参数作为可变长度字符串数组。
    • ApplicationRunner 接口则提供了一个 run(ApplicationArguments args) 方法,它接收一个 ApplicationArguments 对象作为参数,这个对象提供了对传入的所有命令行参数(包括选项和非选项参数)的访问。
  6. 参数解析方式不同
    • CommandLineRunner 接口更简单直接,适合处理简单的命令行参数。
    • ApplicationRunner 接口提供了一种更强大的参数解析能力,可以通过 ApplicationArguments 获取详细的参数信息,比如获取选项参数及其值、非选项参数列表以及查询是否存在特定参数等。
  7. 使用场景不同
    • 当只需要处理一组简单的命令行参数时,可以使用 CommandLineRunner。
    • 对于需要精细控制和解析命令行参数的复杂场景,推荐使用 ApplicationRunner。

      ④ 实现InitializingBean接口

      实现 InitializingBean 接口并重写 afterPropertiesSet 方法,可以在 Spring Bean 初始化完成后执行缓存预热,具体实现代码如下:
      @Component
      public class CachePreloader implements InitializingBean {
             
      @Autowired
      private YourCacheManager cacheManager;
      @Override
      public void afterPropertiesSet() throws Exception {
             
         // 执行缓存预热业务...
         cacheManager.put("key", dataList);
      }
      }
      

      小结

      缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。它可以通过监听 ContextRefreshedEvent 或 ApplicationReadyEvent 启动事件,或使用 @PostConstruct 注解,或实现 CommandLineRunner 接口、ApplicationRunner 接口,和 InitializingBean 接口的方式来完成。

      课后思考

      以上四种缓存预热方法的执行先后顺序是怎么样的?为什么?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

相关文章
|
1月前
|
Java 应用服务中间件 数据库连接
面试官:SpringBoot如何优雅停机?
面试官:SpringBoot如何优雅停机?
133 0
|
2月前
|
消息中间件 Java Kafka
Spring Boot面试题
Spring Boot 是一套快速开发框架,随着微服务架构应用不断普及,Spring Boot 的研发技术的掌握已经成为研发人员必会技能。与此同时,Spring Boot 开源生态建设能力非常强大,提供了很多应用组件,让Spring Boot 有丰富的三方开源软件的使用。
69 0
Spring Boot面试题
|
2月前
|
缓存 Java 应用服务中间件
面试官:如何实现多级缓存?
面试官:如何实现多级缓存?
183 1
|
1月前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
111 0
|
1天前
|
缓存 NoSQL Java
Springboot 多级缓存设计与实现
Springboot 多级缓存设计与实现
|
2天前
|
缓存 NoSQL Java
SpringBoot实现缓存预热的几种常用方案
SpringBoot实现缓存预热的几种常用方案
|
1月前
|
缓存 NoSQL Java
spring cache整合redis实现springboot项目中的缓存功能
spring cache整合redis实现springboot项目中的缓存功能
46 1
|
1月前
|
XML Java 数据格式
【springboot原理篇】Bean的加载方式,面试必看
【springboot原理篇】Bean的加载方式,面试必看
|
1月前
|
缓存 NoSQL Java
【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存
【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存
44 0
|
1月前
|
存储 缓存 Java
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制