题目
如何设计CDN缓存失效策略以保证内容更新及时并减少回源压力?
信息
- 类型:问答
- 难度:⭐⭐
考点
CDN缓存原理,HTTP缓存头机制,缓存失效策略,性能优化
快速回答
核心策略要点:
- 基于HTTP缓存头控制:通过Cache-Control max-age和s-maxage定义缓存周期
- 版本化资源命名:在URL中添加内容哈希(如style.a1b2c3.css)实现永久缓存
- 主动失效机制:使用CDN提供的Purge API强制刷新特定内容
- 分级缓存策略:动态内容设置较短缓存(5-10分钟),静态资源设置长缓存(1年+)
- 验证型缓存:配合ETag/Last-Modified实现304协商缓存
1. 原理说明
CDN缓存失效涉及两个核心机制:
- 被动失效:依赖HTTP缓存头定义的TTL(Time-To-Live),到期后自动失效
- 主动失效:通过CDN服务商API手动触发缓存清除(Purge)
优化关键在于平衡内容新鲜度与回源压力:

2. 最佳实践与代码示例
场景1:静态资源缓存(永久缓存+版本化)
# Nginx 配置示例
location ~* \.(js|css|png)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
# 配合Webpack输出:bundle.[contenthash].js
}场景2:动态内容缓存(短周期+验证)
location /api/data {
add_header Cache-Control "public, max-age=300, must-revalidate";
# 配合ETag验证
}场景3:主动刷新缓存(Python示例)
import requests
# 调用CDN Purge API
def purge_cdn(urls):
resp = requests.post(
"https://api.cdnprovider.com/purge",
auth=(API_KEY, ""),
json={ "files": urls } # 支持URL/目录/通配符
)
return resp.status_code == 2023. 常见错误
- 错误1:设置
Cache-Control: no-cache却未配置ETag,导致每次请求都回源 - 错误2:频繁使用全局刷新(Purge All),引发回源风暴
- 错误3:忽略
Vary头,导致设备类型或语言缓存混乱 - 错误4:动态内容设置过长缓存(如用户个人信息)
4. 性能优化策略
| 策略 | 缓存时间 | 适用场景 |
|---|---|---|
| Immutable资源 | 1年+ | 带哈希的JS/CSS/图片 |
| Stale-While-Revalidate | 主缓存+异步更新 | 新闻列表页 |
| 边缘计算逻辑 | 按需执行 | AB测试分流 |
5. 扩展知识
- 缓存键(Cache Key):CDN通过URL+请求头(如Accept-Encoding)生成唯一缓存标识
- 分层缓存:边缘节点 → 区域中心 → 源站的三级回源机制
- 流量削峰:当大量边缘节点同时失效时,CDN会阶梯式回源避免源站崩溃
- 新兴标准:
Cache-Control: stale-while-revalidate=600允许旧数据服务期间异步更新