讲师中心 微信公众号
AI工具推荐 视频效率加速

Spring Boot集成Redis后如何实现缓存预热功能?

浅强君_9302

浅强君_9302

发布时间:2026-07-19 06:30:46

|

458人浏览过

|

来源于php中文网

原创

不能用@PostConstruct做缓存预热,因其在Bean初始化阶段执行,此时Spring上下文未刷新完成,RedisConnectionFactory等依赖组件可能未就绪,易导致NPE或连接失败;且不保证依赖服务已初始化,存在循环依赖风险,也无法控制执行顺序。

spring boot集成redis后如何实现缓存预热功能?

缓存预热必须在 Spring 容器完全就绪、Redis 连接可用之后执行,否则 RedisTemplate 或 StringRedisTemplate 会为 null,导致 NPE 或连接超时失败。

为什么不能用 @PostConstruct 做缓存预热

@PostConstruct 方法在 Bean 初始化阶段调用,此时 Spring 上下文尚未刷新完成,RedisConnectionFactory 可能还没完成初始化,尤其在启用 SSL、Lettuce 连接池或自定义序列化器时更易出错。常见现象是日志里反复打印 Cannot get Jedis connection 或抛出 RedisConnectionFailureException。

  • 该注解不保证依赖的 Redis 组件已 ready,只保证当前 Bean 的字段注入完成
  • 若预热逻辑依赖其他服务(如 UserRepository),而这些服务又依赖未就绪的缓存组件,会触发循环依赖警告甚至启动失败
  • 无法控制执行顺序:多个 @PostConstruct 方法之间无明确先后关系

CommandLineRunner 是最稳妥的启动后执行点

CommandLineRunner 的 run() 方法会在整个 ApplicationContext 刷新完毕、所有单例 Bean 加载完成后才被调用,此时 RedisTemplate、数据库连接、业务 Service 全部可用。

  • 推荐加 @Order(1) 显式指定优先级,避免与其他 Runner 冲突
  • 预热逻辑应包裹在 try-catch 中,并记录关键日志,例如“预热完成共加载 247 条热点数据”
  • 若预热耗时较长(如 >5s),建议异步执行(用 new Thread(...).start() 或 @Async),防止阻塞主线程影响健康检查探针响应

示例:

Spring Boot Actuator Analyzer
Spring Boot Actuator Analyzer

分析Spring Boot Actuator端点的安全性、健康检查、指标暴露及生产配置——审计信息、健康状态和自定义端点。

下载
@Component
@Order(1)
public class RedisCacheWarmer implements CommandLineRunner {
    @Autowired private RedisTemplate<String, Object> redisTemplate;
    @Autowired private ProductService productService;

    @Override
    public void run(String... args) {
        try {
            List<Product> hotProducts = productService.listHotProducts();
            for (Product p : hotProducts) {
                redisTemplate.opsForValue().set("product:" + p.getId(), p, 30, TimeUnit.MINUTES);
            }
            System.out.println("✅ Redis cache warmed with " + hotProducts.size() + " items");
        } catch (Exception e) {
            System.err.println("❌ Cache warmup failed: " + e.getMessage());
        }
    }
}

ApplicationReadyEvent 更适合需要监听服务真正对外可用的场景

ApplicationReadyEvent 在 Spring Boot Actuator 的 /actuator/health 返回 UP 后才发布,比 CommandLineRunner 稍晚一点,但语义上更准确——它代表应用已就绪、可接收外部请求。

  • 适合预热逻辑强依赖其他微服务已注册(如 Eureka/Nacos)、或需等待配置中心配置拉取完成的场景
  • 注意:若项目未引入 spring-boot-starter-actuator,该事件不会触发
  • 监听时务必检查 event.getApplicationContext().isActive(),避免重复触发(例如在测试上下文中)

示例监听器:

@Component
public class ApplicationReadyCacheWarmer implements ApplicationListener<ApplicationReadyEvent> {
    @Autowired private RedisUtils redisUtils;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        if (event.getApplicationContext().isActive()) {
            redisUtils.warmupAllHotKeys(); // 封装好的预热方法
        }
    }
}

预热失败后不要静默吞掉异常

缓存预热失败本身不会导致 Spring Boot 启动失败,但会让后续请求直接打到数据库,可能瞬间引发雪崩。最容易被忽略的是 Redis 连接池满、序列化器不匹配、或 key 过长被截断这三类问题。

  • 检查 redisTemplate.setKeySerializer(new StringRedisSerializer()) 是否设置正确;默认 JdkSerializationRedisSerializer 会导致 key 出现乱码,GET 命令查不到
  • 批量写入时避免单条 SET,改用 redisTemplate.opsForValue().multiSet(...) 或管道(redisTemplate.executePipelined(...))提升性能
  • 预热数据量大时,记得确认 Redis 的 maxmemory 和淘汰策略(如 allkeys-lru),否则刚预热完就被踢出

真正关键的不是“能不能跑起来”,而是“预热失败时有没有人知道”。上线前至少要在日志中 grep 一次 CacheWarmup 关键字,确认它确实执行了、没报错、且数量对得上。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2391

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

437

2026.01.26

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4349

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3855

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

7012

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

623

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

756

2024.04.07

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6702

2024.04.07

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn