您的位置:首页 > 科技 > 能源 > springboot 缓存预热的几种方案

springboot 缓存预热的几种方案

2024/9/24 5:29:42 来源:https://blog.csdn.net/wu2374633583/article/details/140653058  浏览:    关键词:springboot 缓存预热的几种方案

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

这里我给大家总结几个缓存预热的方案。

方案1:使用启动监听事件实现缓存预热

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

监听 ContextRefreshedEvent事件

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

或监听 ApplicationReadyEvent 事件

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

方案2:使用 @PostConstruct 注解实现缓存预热

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

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

方案3:使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热

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

CommandLineRunner 实现:

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

ApplicationRunner 实现示例:

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

注意:CommandLineRunner 和 ApplicationRunner 区别:

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

方案4:通过实现 InitializingBean 接口,并重写 afterPropertiesSet 方法实现缓存预热

实现 InitializingBean 接口并重写 afterPropertiesSet 方法,可以在 Spring Bean 初始化完成后执行缓存预热。
代码如下:

@Component
public class CachePreloader implements InitializingBean {@Autowiredprivate YourCacheManager cacheManager;@Overridepublic void afterPropertiesSet() throws Exception {// 执行缓存预热业务...cacheManager.put("key", dataList);}
}

总结

  1. 使用启动监听事件实现缓存预热
    优点:可以在应用完全启动之前执行,可以确保缓存预热在所有依赖初始化完成之后进行。
    缺点:处理复杂,需要对Spring的事件机制有一定了解。
  2. 使用@PostConstruct注解实现缓存预热
    优点:简单易用,不需要额外的接口实现,适用于简单的预热逻辑。
    缺点:对于复杂的预热逻辑,可能会导致方法变得臃肿,不易于维护。
  3. 使用CommandLineRunner或ApplicationRunner实现缓存预热
    优点:非常灵活,适合处理复杂的预热逻辑,可以接受参数,易于测试和扩展。
    缺点:可能不如@PostConstruct直观,对于非常简单的预热逻辑可能显得有些过度设计。
  4. 通过实现InitializingBean接口,并重写afterPropertiesSet方法实现缓存预热
    优点:这是Spring推荐的方式之一,保证了bean的生命周期管理,适合需要在属性注入完毕后进行初始化的场景。
    缺点:对于非Spring Bean的类不适用,且对于简单的预热逻辑,可能会觉得有些繁琐。

推荐:

  1. 如果你的预热逻辑较为简单,且希望保持代码简洁,推荐@PostConstruct注解。
  2. 对于更复杂的情况,尤其是需要接收参数或执行更复杂的业务逻辑时,使用CommandLineRunner或ApplicationRunner会更加合适,它提供了更多的灵活性和控制。
  3. 如果你正在处理的是一个Spring Bean,并且需要在属性注入完成后执行预热逻辑,那么实现InitializingBean接口是标准且推荐的做法。

所以比较推荐后两种方案。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com