大促活动前的缓存预热,核心结论就一句话:把用户即将访问的热数据提前塞进缓存,同时给带宽峰值留出余量,二者必须放在同一个时间轴上规划,才能避免活动当天缓存击穿和带宽打满双双爆发。
很多团队把缓存预热和带宽规划当成两件事分开做,结果往往是大促前一晚刷了一堆key,第二天流量一上来,缓存命中率确实稳住了,但带宽先爆了,这两个问题本质上是一根绳上的蚂蚱,预热带来的缓存命中提升,会直接减少回源请求,进而释放带宽压力,反过来,带宽规划不合理,即使缓存全命中,静态资源的体积也可能直接把入口带宽打穿。
大促前缓存预热怎么做:分步骤拆解执行路径
缓存预热不是把核心数据全量塞进Redis就完事,那样做既浪费内存,又容易在预热阶段把后端数据库压垮,行业共识认为,预热的核心是识别热key、分批写入、验证命中,三个环节缺一不可。
第一步:从历史日志里扒出热key清单
预热的第一步永远是数据收集,而不是直接写缓存,具体操作路径是这样的:
- 拉取最近7天的接入层访问日志,按请求URL和参数组合做聚合统计,找出请求量排名前10%的key
- 对照业务日历,标记出与本次大促强相关的活动商品、秒杀页面、优惠券池等特殊key
- 将历史热key与运营确认的活动主推清单合并,按预估流量大小分为P0/P1/P2三个优先级
这里有一个容易踩的坑:只看总请求量会把一些日常稳定但大促未必热的数据排到前面,而忽略那些活动期间突然暴涨的新key,处理办法是叠加时间窗口权重把最近3天的日志单独拉出来跑一遍,近期的请求量在加权计算中占更高比重。
第二步:错峰预热,给后端留缓冲
热key清单确定后,不要一股脑全部灌进去,根据多年大促保障的经验,预热动作应该像倒时差一样,分阶段进行。
- P2级别:大促前3天开始,每天凌晨低峰期预热一次,利用脚本扫描数据库变更记录,将更新过的数据同步到缓存
- P1级别:大促前1天,在业务低峰期(通常是凌晨2点到5点)分批次预热,每批次控制并发数,避免Redis的CPU被打满
- P0级别:大促前2-4小时,最后一批核心数据预热,配合开关控制,做到可灰度、可回滚
每批次预热完成后,抽样验证是必做步骤,比如抽查100个key,逐个执行缓存读取,确认value完整且TTL设置正确,这一环节经常被忽略,实际预热脚本跑完不等于数据可用,TTL设置错误、序列化格式不匹配等问题在活动当天才发现就晚了。
第三步:预热后的持续补热机制
预热是静态动作,但大促流量是动态的,活动开始后,新的热key会不断冒出来,预热阶段的清单并不能覆盖所有情况,所以还需要一套兜底补热机制

:
- 在应用层埋点监测缓存Miss率,当某个key的Miss频率超过阈值时,自动触发异步回源并回写缓存
- 设置多级缓存而非只有一层Redis,本地进程内缓存(如Caffeine)+分布式缓存(如Redis)组合使用,本地缓存命中后天然降低Redis压力
- 对活动核心数据不做过期驱逐,而是手动指定TTL,确保大促期间这些key不被LRU算法随机淘汰
这套机制的核心目的,是把“事前预热”和“事中补热”衔接起来,解决集中写入和动态变化之间的矛盾。
大促带宽峰值怎么预判与应对
缓存预热解决的是数据层压力,但带宽是入口层的硬约束,带宽峰值应对的核心在于预估要准、扩容要早、削峰要狠。
带宽预算公式:三个维度交叉估算
做带宽预算时,不能用“去年用了多少”直接乘增长系数,那样太粗糙,业内专家指出,合理的带宽预估应该拆成三个维度:
- 流量总量:根据预约用户数、历史大促转化率,预估出页面浏览总量(PV),再除以活动持续时长得到平均QPS
- 单次请求体积:页面经压缩后的HTML、关键JS、CSS、首屏图片的大小之和,这决定了每个请求消耗多少带宽
- 峰值系数:大促流量不是平滑的,通常会出现开售瞬间的流量尖峰,往往是平均流量的3到8倍,需要按最坏情况预留
计算公式可以简化成:峰值带宽 = 预估峰值QPS × 单次请求体积 × 冗余系数,冗余系数多数情况下建议放在1.5到2之间,留有安全余量。
传输层优化:把每个字节都压到最小
带宽不够用的时候,除了扩容,更优先做的事情是减小单位请求的传输体积,具体操作路径如下:
- 开启Brotli或Gzip压缩,优先使用Brotli,压缩率比Gzip平均高出15%到20%
- 图片转为WebP格式,首屏banner等大图设置合理的压缩质量参数
- 静态资源全部走CDN,并在CDN层配置缓存规则,设置较长的Cache-Control有效期
- 对HTML页面做流式响应,服务端边生成边发送,减少首字节等待时间
有一类常见问题是某些活动页面把大段JSON直接渲染在HTML里,比如用户的优惠券列表、购物车明细,这些内容动辄几十KB,且每次请求都会变化,处理方式是改为异步接口加载,页面主体只返回壳子,数据通过后续的XHR请求填充,这样核心页面体积能减少一大半。
带宽打满时的分级降级预案
即使提前做了扩容和压缩,活动期间仍可能出现流量超预期的情况,这时候需要一套明确的分级降级机制:
| 优先级 | 降级动作 | 实施条件 | 用户感知 |
|---|---|---|---|
| 一级 | 动态接口增加限流,部分非核心接口返回排队提示 | 带宽使用率超过70% | 轻微 |
| 二级 | 关闭非核心图片加载,仅保留商品主图 | 带宽使用率超过85% | 中等 |
| 三级 | 活动页面切换为纯静态版本,动态区域全部隐藏 | 带宽使用率超过95% | 明显但可接受 |
这个降级预案需要在大促前进行预演,不能只停留在文档层面,技术团队至少要完整演练一次从一级到三级的切换流程,确认每个开关能正确生效,降级开关的入口权限要收拢到核心运维或技术负责人手中,避免大促时多人操作造成混乱。
缓存预热与带宽峰值如何协同调度
前面分别说了预热和带宽,但实际大促保障中,二者是相互影响、需要统一调度的。
预热时间窗对齐带宽低谷
预热的本质是数据写入,对内网带宽有一定消耗,但更关键的是预热动作触发的回源查询会占用数据库连接数,如果预热时间和带宽预留没有对齐,可能出现预热高峰和流量高峰重叠,两波压力叠加导致后端雪崩。
建议做法是,将所有预热任务集中编排在一个时间轴上:
- 大促前72小时:完成静态资源上传CDN,预热信息同步至各节点
- 大促前48小时:P2级数据预热开始,控制在业务低峰期执行
- 大促前24小时:P1级数据预热,同时将CDN回源率报表拉出,确认回源请求量在预期范围内
- 大促前4小时:P0级数据预热,同时进行最后一轮带宽压测
这个时间规划里,预热动作最好安排在带宽低谷期,比如凌晨时段,因为白天带宽本身有日常业务占用,再做集中预热数据的批量回源,可能造成带宽数据异常波动,把CTO拉进“大促技术保障群”的意义就在于此带宽预算的确定,需要技术负责人拍板预留多少冗余,不能层层加码也不能过度乐观。
用预热命中率反推带宽冗余
这是一个经常被忽视的联动关系,大促当天的实际带宽需求,并不完全取决于QPS预估,还取决于缓存命中率与CDN命中率,如果缓存预热做得好,动态请求的回源率低,源站带宽压力就小;如果CDN预热做得好,静态资源的边缘节点命中率高,源站带宽更是大幅释放。
实际操作中,可以这样联动评估:
- 活动开始后,每5分钟查看一次缓存命中率和CDN回源率
- 如果动态请求命中率超过90%,说明预热效果良好,带宽余量可以适当下调
- 如果命中率低于80%,说明预热清单覆盖不足,需要立即检查哪些key发生了穿透,及时补热
这种通过命中率反推带宽状态的思路,能让带宽规划从“拍脑袋预留”变成“动态调整”,也避免了一些团队为求保险把带宽买得过高、造成不必要的成本浪费。
热点数据如何先在缓存里多留一份:兜底策略详解
即使预热再充分,大促场景下总有查询不到的数据,热key突然失效、流量倾斜到某个从未预热的商品上、或者活动规则临时调整导致数据变更,这些情况都会让缓存防线出现缺口,除了事前预热,事中的兜底策略同样重要。

单机热key发现:本地统计加异步上报
热key的发现不能只靠人工排查,要有自动化机制,在应用层,可以给每个缓存客户端增加本地计数器,统计每个key在本地被命中的次数,当某个key在一个窗口期(比如1分钟)内的命中次数超过设定阈值时,将该key的信息异步上报到集中式监控服务。
拿到这些上报数据后,运维人员就能实时看到哪些key在哪个节点上产生了大量请求,紧接着可以在该节点上手动执行一次“提前刷新”,这样的好处是不依赖集中式缓存也顶得住瞬时流量,因为热key已经在本地内存里了。
多级缓存和互斥锁的配合
对于发现较晚或者无法提前预热的突发热key,常用的兜底手段是多级缓存加互斥锁:
- 本地缓存作为第一级,容量很小但速度最快,适合放少数热key
- Redis作为第二级,容量较大,适合放中等热度的key
- 当两级缓存都未命中时,进入数据库查询前先获取一个分布式锁,让同一时刻只有一个请求回源数据库,其他请求短暂等待后重新读取缓存
互斥锁方案有一个默认前提:锁等待时间要短,否则增加的延迟会抵消掉缓存节省的开销,所以实现时最好配合超时时间,比如等待50毫秒后如果还没拿到锁,就释放并稍作重试,而不是无限阻塞。
大促预热与带宽应对常见问题
缓存预热时数据库压力过大怎么办
预热脚本批量执行时会直接读数据库,如果无条件全量扫描,对数据库的冲击往往相当明显,解决办法是把预热拆成小批次,按key范围分段执行,并且严格控制每批次之间的间隔时间,更稳妥的方式是从备库读取数据,或者直接读取前一天导出的数据快照文件来构建缓存,绕开主库压力。
预热完成后发现部分key提前过期了
TTL设置不当是导致预热效果打折的主要原因,如果某条数据在活动开始前就过期了,预热等于白做,应对手段是:对核心活动数据不设置过期时间或设置超长TTL,依靠业务代码在数据变更时手动删除或更新缓存,如果担心内存泄漏,可以在活动结束后统一清理,预热脚本执行完,要在代码里做一个自动校验随机抽出一批key检查剩余TTL,如果发现有大面积即将过期的,立即重新写入。
带宽扩容应该提前多久提交工单
不同云厂商的带宽扩容审批流程差异很大。多数情况下提前3到5个工作日提交比较稳妥,可以留出审批和资源调度的时间,如果用的是按量计费的弹性带宽,可以当天自动扩容,但仍建议提前在控制台手动配置好上限策略,设置一个自动告警通知,避免超额产生计划外费用。
