5月27日 22:32
CDN 缓存策略有哪些?命中率怎么优化?
直接回答
CDN 缓存策略核心就三件事:控制缓存多久(TTL)、区分缓存谁(Cache Key)、决定何时更新(刷新机制)。优化命中率的关键是:减少回源、合理分 TTL、忽略无关参数、预热热门资源。
缓存策略拆解
TTL 策略——最基础的缓存控制
TTL 决定内容在边缘节点的存活时间:
- 静态资源(图片、字体、CSS/JS 带 hash):设长 TTL,甚至
max-age=31536000, immutable - 半静态内容(商品页、文章页):分钟级 TTL,配合软刷新
- 动态接口(用户数据、实时行情):不缓存或秒级 TTL,走协商缓存(ETag / Last-Modified)
httpCache-Control: public, max-age=31536000, immutable // 带 hash 的静态资源 Cache-Control: public, max-age=300, s-maxage=60 // CDN 缓 60s,浏览器缓 5min Cache-Control: no-cache, ETag: "v2-abc" // 协商缓存
Cache Key 策略——决定哪些请求共享缓存
默认 Cache Key 是完整 URL。问题在于:?utm_source=weibo 和 ?utm_source=zhihu 本是同一资源,却被分成两条缓存,白白回源。
优化方式:
- 忽略无关查询参数:过滤
utm_*、timestamp等不影响内容的参数 - 自定义 Cache Key:加入
Cookie中的地区码,忽略PHPSESSID - Vary 头:让 CDN 按
Accept-Encoding区分 gzip/br 版本
分层缓存——边缘 → 区域 → 源站
请求查找顺序:边缘节点 → 区域节点 → 源站。边缘未命中会回区域,区域未命中才回源。所以优化重点是让请求尽量在边缘命中。
命中率优化实战
1. 忽略 URL 参数
这是命中率低最常见的原因。一条 ?token=xxx 就能让缓存全部失效。阿里云 CDN 实测:忽略无关参数后命中率可从 40% 提升到 90%+。
2. 大文件分片回源(Range 回源)
用户看视频只看了前 5 分钟,但 CDN 回源拉了整个文件。开启 Range 回源后只拉需要的片段,减少回源流量,也提升字节命中率。
3. 缓存预热
新版本发布或大促前,主动把热门资源推到各边缘节点。两种方式:
- API 预热:调用 CDN 控制台接口主动推送
- 模拟请求:用脚本批量请求触发被动缓存
4. 版本化发布代替刷新
与其发版后全站刷新缓存,不如在文件名里带 hash:app.3f2a1b.js。内容变了 hash 就变,旧缓存自然过期,无需主动刷新。
5. 监控命中率指标
- 请求命中率 = 缓存命中请求数 / 总请求数
- 字节命中率 =(边缘响应流量 - 回源流量)/ 边缘响应流量
请求命中率 >90% 为健康,70%-90% 需要优化,<70% 必须排查。
追问:内容更新后用户还看到旧版本怎么办?
三层解法,按优先级:
- 文件名带 hash,一劳永逸(最推荐)
- URL 刷新,精确清除单条缓存
- 全站刷新,最后手段,会瞬间压高源站
追问:缓存命中率突然下降怎么排查?
按这个顺序查:
- 看是否有新参数打入了 Cache Key(查访问日志里的 URL 变体)
- 看源站是否返回了
no-store/private头 - 看 TTL 是否被覆盖缩短
- 看是否有大流量回源(可能是爬虫或攻击绕过缓存)