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)
http
Cache-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% 必须排查。

追问:内容更新后用户还看到旧版本怎么办?

三层解法,按优先级:

  1. 文件名带 hash,一劳永逸(最推荐)
  2. URL 刷新,精确清除单条缓存
  3. 全站刷新,最后手段,会瞬间压高源站

追问:缓存命中率突然下降怎么排查?

按这个顺序查:

  1. 看是否有新参数打入了 Cache Key(查访问日志里的 URL 变体)
  2. 看源站是否返回了 no-store / private
  3. 看 TTL 是否被覆盖缩短
  4. 看是否有大流量回源(可能是爬虫或攻击绕过缓存)
标签:CDN