这组头是干什么的
X-Cache、X-Cache-Hits、CF-Cache-Status、X-Served-By 这类是 CDN 与代理的私有诊断头,没有统一标准,各家取值含义要查对应文档。它们回答的是排序缓存问题时最先要弄清的一件事:这次请求命中了边缘缓存,还是回源了。
怎么用才有意义
单看一次响应说明不了什么:命中率要在同一个地址上多次请求再看分布。如果命中与未命中交替出现,通常意味着缓存键里混进了不该混的东西(例如把全部查询串或 Cookie 算进键),或者缓存生存时间设得太短。
基本信息
| 常见取值 | HIT、MISS、EXPIRED、REVALIDATED、BYPASS、DYNAMIC |
|---|---|
| 规范状态 | 无标准,由各家自行定义 |
| 关联头部 | Age、Via、Server 一起看,能区分边缘命中与回源 |
| 判断方法 | 同一地址多次请求,统计取值分布 |
典型使用场景
- 调整缓存策略后验证命中率变化
- 排查「内容更新了但用户仍看到旧版本」
- 判断某类请求为什么从来不命中
- 定位回源压力的主要来源
批量判断命中率
批量判断命中率
for i in $(seq 1 20); do
curl -sI https://www.example.com/ | awk -F': ' 'tolower($1)=="x-cache"{print $2}'
done | sort | uniq -c
# 同时观察 Age 与缓存控制字段,判断是边缘命中还是每次都回源取值怎么读
| 取值 | 含义 | 下一步 |
|---|---|---|
| HIT | 由边缘缓存直接返回 | 结合 Age 判断这份副本有多旧 |
| MISS | 本次未命中,回源取新 | 看是否有不该进入缓存键的因素 |
| EXPIRED | 副本过期后重新校验或取新 | 属于正常的刷新行为 |
| BYPASS | 按规则跳过缓存 | 检查是否因 Cookie 或请求头被排除 |
| DYNAMIC | 该类型内容不参与缓存 | 确认是否符合预期 |
调完缓存策略(生存时间、缓存键是否包含查询串)后,用命中率的变化验证效果,比逐条翻响应更可靠。
把 HIT 理解成「用户拿到的就是最新内容」是错的:命中的也可能是过期后尚未重新验证的旧副本,必须结合 Age 一起判断。