• 12 Redis之Lua脚本


    10. 缓存预热warmup

    缓存预热指的是提前将热点数据加载到缓存中,这样当用户或系统开始请求这些数据时,它们已经可用,无需等待数据从慢速存储(如数据库)中检索。这有助于避免冷启动问题,提高系统的响应速度和吞吐量。

    对于具有缓存 warmup 功能的系统,DBMS 中常用数据的变更,都会引发缓存中相关数据的更新。

    Redis缓存预热的场景:

    • 系统重启或部署: 重新部署应用程序后,缓存可能会被清空,预热可以迅速恢复缓存状态。
    • 数据更新: 当缓存中的数据定期更新时,预热可以确保最新数据的快速可用性。
    • 流量高峰: 在预期流量高峰之前预热缓存,可以帮助系统更好地应对负载。

    10.1 实现方案

    在 Spring Boot 启动之后,可以通过以下四种方案实现缓存预热:

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

    10.1.1 使用启动监听事件实现缓存预热

    ① 启动监听事件

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

    @Component
    public class CacheWarmer implements ApplicationListener<ContextRefreshedEvent> {
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            // 执行缓存预热业务...
            cacheManager.put("key", dataList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    @Component
    public class CacheWarmer implements ApplicationListener<ApplicationReadyEvent> {
        @Override
        public void onApplicationEvent(ApplicationReadyEvent event) {
            // 执行缓存预热业务...
            cacheManager.put("key", dataList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ② @PostConstruct 注解

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

    @Component
    public class CachePreloader {
        
        @Autowired
        private YourCacheManager cacheManager;
    
        @PostConstruct
        public void preloadCache() {
            // 执行缓存预热业务...
            cacheManager.put("key", dataList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ③ 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ApplicationRunner 实现示例如下:

    @Component
    public class MyApplicationRunner implements ApplicationRunner {
        @Override
        public void run(ApplicationArguments args) throws Exception {
            // 执行缓存预热业务...
            cacheManager.put("key", dataList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    CommandLineRunner 和 ApplicationRunner 区别如下:

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

    ④ 实现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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    小结

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

    . Lua脚本

    Lua 是一个由标准 C 语言开发的、开源的、可扩展的、轻量级的、弱类型的、解释型脚本语言

    常用于Nginx/分布式锁/

    先下载并安装Lua

  • 相关阅读:
    【Rust】操作日期与时间
    Vue 路由
    专为小白打造—Kafka一篇文章从入门到入土
    【FreeCodeCamp】 ResponsiveWebDesign网页设计 测试2学习笔记
    Springboot项目中的异常处理与返回结果的统一
    3D Gaussian Splatting:用于实时的辐射场渲染
    OSPF综合大实验
    项目需求及架构设计
    敏捷、DevOps和嵌入式系统测试
    [vscode]使用cmake时将命令行参数传递给调试目标
  • 原文地址:https://blog.csdn.net/m0_46671240/article/details/136333340