Springboot实现缓存预热的方法

 更新时间:2024年03月05日 10:52:35   作者:Spirit_NKlaus  
在系统启动之前通过预先将常用数据加载到缓存中,以提高缓存命中率和系统性能的过程,缓存预热的目的是尽可能地避免缓存击穿和缓存雪崩,这篇文章主要介绍了Springboot实现缓存预热,需要的朋友可以参考下

很多时候我们代码中使用缓存时都是先判断缓存中没有数据我们再读取数据库而有则直接使用缓存数据,而在系统冷启动(当系统重启或新启动时,缓存是空的,这被称为冷启动)时,我们毫无意外都是直接获取数据库的内容,这时候缓存的命中率几乎为0,这时候我们需要考虑业务系统的缓存预热功能,在系统启动之前通过预先将常用数据加载到缓存中,以提高缓存命中率和系统性能的过程。缓存预热的目的是尽可能地避免缓存击穿和缓存雪崩。

一、系统启动时加载

1、CommandLineRunner和ApplicationRunner是SpringBoot中用于在应用程序启动后执行特定逻辑的接口。

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
/**
 * 缓存预热器(CommandLineRunner方式)
 */
@Component
@Slf4j
public class CacheCLRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        //TODO 缓存预热逻辑
        log.info("CommandLineRunner方式完成缓存预热");
    }
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
 * 缓存预热器(ApplicationRunner方式)
 */
@Component
@Slf4j
public class CacheAppRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        //TODO 缓存预热逻辑
        log.info("ApplicationRunner方式完成缓存预热");
    }
}

2、实现InitializingBean接口,并在afterPropertiesSet方法中执行缓存预热的逻辑。这样Spring在初始化Bean时会调用afterPropertiesSet方法

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
/**
 * 缓存预热器(InitializingBean方式)
 */
@Component
@Slf4j
public class CacheInitializing implements InitializingBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        //TODO 缓存预热逻辑
        log.info("InitializingBean方式完成缓存预热");
    }
}

3、基于ApplicationReadyEvent,我们可以在应用程序完全启动并处于可用状态后执行一些初始化逻辑。使用@EventListener注解或实现ApplicationListener接口来监听这个事件。
4、@PostConstruct注解标注一个方法,该方法将在 Bean 的构造函数执行完毕后立即被调用。
这里3、4点的例子写在一起

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
 * 缓存预热器(ApplicationReadyEvent和@PostConstruct方式)
 */
@Component
@Slf4j
public class CacheLoader {
    @EventListener(ApplicationReadyEvent.class)
    public void loadCache1() {
        //TODO 缓存预热逻辑
        log.info("@EventListener方式完成缓存预热");
    }
    @PostConstruct
    public void loadCache2() {
        //TODO 缓存预热逻辑
        log.info("@PostConstruct方式完成缓存预热");
    }
}

启动项目大致看一下4种方式的加载顺序,可根据自己的需求选择对应的方式

二、定时任务加载

使用Spring的@Scheduled,quartz,xxl-job都可以,@Scheduled为例

@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行
public void scheduledCachePreload() {
	//TODO 缓存预热逻辑
	log.info("定时任务方式完成缓存预热");
}

更多java知识请点击下方名片!

到此这篇关于Springboot实现缓存预热的文章就介绍到这了,更多相关Springboot缓存预热内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基础之垃圾回收机制详解

    Java基础之垃圾回收机制详解

    这篇文章主要介绍了Java基础之垃圾回收机制详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Springboot读取templates文件html代码实例

    Springboot读取templates文件html代码实例

    这篇文章主要介绍了Springboot读取templates文件html代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java SE实现多人聊天室功能

    Java SE实现多人聊天室功能

    这篇文章主要为大家详细介绍了Java SE实现多人聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Java数据库连接_jdbc-odbc桥连接方式(详解)

    Java数据库连接_jdbc-odbc桥连接方式(详解)

    下面小编就为大家带来一篇Java数据库连接_jdbc-odbc桥连接方式(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Quartz与Spring集成的两种方法示例

    Quartz与Spring集成的两种方法示例

    这篇文章主要为大家介绍了Quartz与Spring集成的两种方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Java函数式接口Supplier接口实例详解

    Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • jvm垃圾回收之GC调优工具分析详解

    jvm垃圾回收之GC调优工具分析详解

    这篇文章主要为大家介绍了jvm垃圾回收之GC调优工具的分析详解,在进行JVM GC性能调优之前,需要使用某些工具获取到当前应用的状态信息
    2022-01-01
  • 详解mybatis-plus使用@EnumValue注解的方式对枚举类型的处理

    详解mybatis-plus使用@EnumValue注解的方式对枚举类型的处理

    这篇文章主要介绍了详解mybatis-plus使用@EnumValue注解的方式对枚举类型的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Spring MVC请求处理流程和九大组件详解

    Spring MVC请求处理流程和九大组件详解

    这篇文章主要介绍了Spring MVC请求处理流程和九大组件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • Java httpclient请求form-data格式并设置boundary代码实现方法

    Java httpclient请求form-data格式并设置boundary代码实现方法

    在 Java 开发中,经常会遇到需要使用 httpclient 发送 form-data 格式请求的场景,本文将详细介绍如何正确地实现这一操作,包括数据格式示例、常见报错及解决方法,本文通过实例代码详解讲解,感兴趣的朋友一起看看吧
    2025-01-01

最新评论