尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
缓存预热(Cache Warm-up)的解决方案与对比
这里写自定义目录标题一、缓存预热Q1为什么需要?Q2哪些适合二、缓存预热常见的方式1.应用启动时预热PostConstruct 和 ApplicationReadyEvent 的使用对比2.定时任务预热3.活动开始前主动预热4.人工/后台触发预热5.根据历史访问数据预热热点6.预测未来热点进行预热7.缓存失效前主动刷新三、实际项目中的缓存预热解决方案1.常见的解决方案2.预热中出现的缓存雪崩、缓存击穿3.缓存预热失败4.多个实例重复预热一、缓存预热缓存预热Cache Warm-up指的是在用户真正访问数据之前提前把后续可能频繁访问的数据加载到缓存中。Q1为什么需要?正常的缓存用到了再缓存即第一次请求 - 缓存没有数据 - 查数据库 - 写入缓存 - 返回结果。后续请求直接查缓存这种方式叫做懒加载本质是先访问 → 再缓存缓存预热是系统启动 / 活动开始 / 流量到来之前 - 提前查数据 - 写入缓存这样用户请求到来时候直接命中缓存缓存预热最主要解决的是缓存刚开始为空时大量请求直接访问后端存储的问题。缓存预热的目的是降低第一次访问的响应时间防止系统启动时数据库压力突然增大应对可预测的流量高峰。Q2哪些适合缓存预热适合“读多写少、访问频繁、热点可预测、冷启动压力较大”的业务数据。适合使用缓存预热高频访问的数据、热点可以提前预测、系统启动后马上会被访问的数据、数据变化不频繁、数据库查询成本比较高的数据。不适合全量预热数据量特别大、访问频率非常低、热点无法预测、数据变化非常频繁、每个用户完全不同的数据。二、缓存预热常见的方式1.应用启动时预热应用启动的时候主动把一批固定数据加载进缓存。ComponentpublicclassCacheWarmUp{EventListener(ApplicationReadyEvent.class)publicvoidwarmUp(){// 1. 查询数据库ListCategorycategoriescategoryMapper.selectList(null);// 2. 写入缓存redisTemplate.opsForValue().set(category:list,categories);}}EventListener(ApplicationReadyEvent.class)监听 Spring Boot 应用启动完成事件。当 Spring BootSpring 容器初始化完成Bean 基本创建完成应用已经准备完成之后会发布一个ApplicationReadyEvent 此时被 EventListener 修饰的方法就会执行。PostConstruct 和 ApplicationReadyEvent 的使用对比PostConstruct常用于标记方法使其在对象实例化并完成依赖注入后立即执行。它通常用于初始化逻辑例如加载配置、建立连接等。其具体逻辑如下。如果 Redis 或 MySQL出问题则会导致Bean 初始化失败从而导致 Spring Boot 启动失败Bean 创建 ↓ 依赖注入 ↓ PostConstruct ↓ 查询数据库 ↓ 访问 Redis ↓ 加载缓存 ↓ Bean 初始化结束EventListener(ApplicationReadyEvent.class)其中的EventListener 注解用于监听应用程序事件。它可以标记一个方法使其成为事件监听器用于处理特定类型的事件。其执行逻辑如下这种方法可以先让 Spring Boot 本身完成启动再执行非核心初始化任务。Spring Context 创建完成 ↓ 所有 Bean 初始化完成 ↓ Tomcat / Netty 等基本启动完成 ↓ ApplicationReadyEvent ↓ 缓存预热EventListener默认是同步执行的不是自动异步如果预热很重缓存预热时有流量进来而缓存还没加载完接能报错、可以加 AsyncAsyncEventListener(ApplicationReadyEvent.class)publicvoidinitCityMap(){reload();}2.定时任务预热比如一个热门商品排行榜每隔 10 分钟变化一次。Scheduled(cron0 */10 * * * ?)publicvoidrefreshHotProducts(){ListProductproductsproductService.queryHotProducts();redisTemplate.opsForValue().set(hot:products,products);}Scheduled(cron “0 */10 * * * ?”) 用于执行定时任务。这里表示每隔 10 分钟执行一次。Cron 表达式0 */10 * * * ? 可以简单理解为秒0分钟每 10 分钟小时任意日期任意月份任意星期任意3.活动开始前主动预热例如 20:00 开始秒杀可以提前在 19:50 加载秒杀商品写 RedispublicvoidwarmUpSeckill(LongproductId){ProductproductproductMapper.selectById(productId);redisTemplate.opsForValue().set(seckill:product:productId,product);}warmUpSeckill() 本身只是一个普通方法什么时候需要预热就需要什么时候调用这个方法。4.人工/后台触发预热例如运营人员准备明天推广商品 10001此时运营后台可以提供预热商品PostMapping(/cache/warm-up/{productId})publicvoidwarmUp(PathVariableLongproductId){ProductproductproductMapper.selectById(productId);redisTemplate.opsForValue().set(product:productId,product);}5.根据历史访问数据预热热点如果系统数据量非常大就不能所有数据全部预热。例如100 万商品。可以通过分析过去一段时间的访问数据找出真正的热点商品。6.预测未来热点进行预热例如新闻系统中某一篇文章访问量快速上涨 评论量快速上涨 转发量快速上涨。系统可能判断该文章即将成为热点于是提前缓存文章详情 评论列表 作者信息 推荐内容。7.缓存失效前主动刷新在缓存真正过期之前提前把它刷新。例如Redis Key TTL 30 分钟。这种方案通常叫Refresh Ahead提前刷新。适合高频热点数据、首页数据、排行榜、热门商品、对响应时间要求较高的数据。三、实际项目中的缓存预热解决方案1.常见的解决方案热点数据预热 普通数据懒加载2.预热中出现的缓存雪崩、缓存击穿缓存雪崩TTL 随机值缓存击穿分布式锁 逻辑过期3.缓存预热失败缓存预热并不一定每次都会成功。可能出现数据库异常 或者 Redis 异常 或者 网络异常。因此缓存预热需要考虑失败处理。4.多个实例重复预热在分布式系统中一个服务通常会部署多个实例。例如四个 Java 服务同时启动。每个服务都有 ApplicationReadyEvent这样导致四个实例一起查询同样的数据写同样的 Redis Key解决方案分布式锁过 Redis / Redisson 分布式锁保证同一时刻只有一个实例真正执行缓存构建。Double Check防止等待锁的线程获得锁之后再次重复查询数据库。//第一次查缓存不在Redis后尝试获取锁RLocklockredissonClient.getLock(lockKey);lock.lock();//拿不到锁就等待直到成功获取锁。try{// 第二次检查先检查Redis}finally{lock.unlock();}统一任务调度如果缓存预热逻辑比较复杂也可以不让每一个服务实例自己执行预热。而是交给统一的任务调度系统例如XXL-JOB、Quartz、ElasticJob。
RELATED

相关推荐

【Matlab】城市应急疏散仿真与评估实现

【Matlab】城市应急疏散仿真与评估实现

【Matlab】城市应急疏散仿真与评估实现 一、引言 城市是人口高度集聚、功能高度集中的复杂系统,地震、火灾、洪涝、突发公共安全事件等灾害具备突发性强、扩散速度快、影响范围广的特征。灾害发生后,快速有序的人员疏散是降低人员伤亡、减少灾害损失、保障公共安全的核心环…

📅 2026/9/14 22:38:40
环保数据监测系统:从数据采集到可视化大屏的完整实践

环保数据监测系统:从数据采集到可视化大屏的完整实践

在环保领域待久了你会发现,真正缺的不是监测设备,而是能把分散、杂乱的数据变成决策依据的那条链路。我做的这个“环保科技数据监测”项目,就是用一套标准的大数据流程——采集、清洗、存储、计算、可视化——把空气质量站、水质监测点、噪声…

📅 2026/9/14 22:38:40
vivo通信智能体:从信号拼参数到体验驱动,让手机更懂你的网络需求

vivo通信智能体:从信号拼参数到体验驱动,让手机更懂你的网络需求

手机厂商这些年最爱讲的故事,已经从"跑分多高、参数多猛"悄悄变成了"体验多顺、场景多懂"。我自己用vivo手机这几年,最直观的感受是:通信这件事,正在从"网络驱动"转向"体验驱动"。以前我…

📅 2026/9/14 22:38:40
MORE NEWS

更多资讯

📰

DeFi技术解析:智能合约与金融乐高的工程实践

1. DeFi:当金融遇上区块链乐高第一次接触DeFi是在2020年夏天,当时我在调试一个以太坊智能合约,偶然发现Compound协议允许任何人无需许可地存入加密货币赚取利息。这种完全不同于传统银行的运作方式让我着迷——没有开户审核,没有营…

📰

基于GAN的复杂背景文字修复:从掩码到对抗训练实战

简介:基于生成对抗网络(GAN)实现复杂背景文字图像修复的完整Python源码项目,面向计算机视觉、图像处理方向的开发者与研究者,重点解决自然场景中因遮挡、退化导致的文字模糊或缺失问题。项目利用生成对抗网络对图像进行…

📰

【三个月 AI Agent 实战学习】Day 6:结构化输出(JSON)—— 让模型与代码无缝协作

Day 6 详细展开:结构化输出(JSON)—— 让模型与代码无缝协作 欢迎来到第六天!在前几天,我们学习了如何让模型回答问题、如何让它一步步思考。但在构建 AI Agent 时,模型往往不是最终的执行者——它需要把“…

📰

YOLOv5+ArcFace:从人脸检测到身份识别的完整改进实践

简介:这是一套面向高校计算机、电子信息、数学等专业学生进行课程设计、期末大作业或毕业设计的人脸识别改进方案,基于YOLOv5目标检测框架实现,包含完整源码、测试图片与说明文档。包内共95个文件,压缩后约8.94MB,核心…

📰

Flutter与HarmonyOS 6.0构建旅行记录应用类型选择器

1. 项目背景与核心需求在移动互联网时代,旅行记录类应用已经成为现代人记录生活的重要工具。随着HarmonyOS 6.0的发布和Flutter框架的持续演进,开发者有了更多跨平台开发的选择。本文将详细介绍如何基于Flutter和HarmonyOS 6.0构建一个旅行记录应用中的关…

📰

毕业设计之微信小程序酒店预约管理系统

题目:毕业设计之微信小程序酒店预约管理系统一、项目介绍伴随着全球信息化发展,行行业业都与计算机技术相衔接,计算机技术普遍运用于酒店、宾馆行业。实施计算机系统来管理可以降低酒店成本,使整个酒店的发展和服务水平有显著提升…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬