缓存命中率骤降的头号元凶是缓存键混入随机参数(如t、_r、utm_*等),它们不参与内容生成却污染缓存键,导致同一资源被拆成多个key反复回源;需通过日志、响应头和curl测试精准识别并过滤无关参数。

缓存键里混入随机参数(比如 ?t=1726455240、&_r=abc123、&utm_medium=cpc)是缓存命中率骤降的头号元凶。这类参数不参与内容生成,却直接污染缓存键,让同一资源被拆成几十个“不同资源”反复回源。排查关键不是找“有没有”,而是确认“哪些参数不该进缓存键”。
检查请求 URL 中的可疑参数
抓取真实用户请求(Nginx 日志、CDN 的 X-Forwarded-For + Request-URI、浏览器 Network 面板),重点关注问号后出现的字段:
- 时间戳类:
t、ts、timestamp、now - 客户端指纹类:
_r、rand、random、cacheBuster - 营销追踪类:
utm_*、ref、source、campaign - 浏览器/设备标识类:
device_id、browser_version(除非业务真依赖它)
验证缓存键是否实际包含这些参数
不能只看 URL —— 要确认 CDN 或缓存中间件是否真的把它们当成了缓存键的一部分:
- 腾讯云 CDN:查看「缓存配置」→「查询字符串处理」,确认是否勾选了「忽略指定参数」或设为「忽略全部」
- 自建 Nginx + proxy_cache:检查
proxy_cache_key变量是否用了$scheme$host$request_uri(含全部 query);应改为$scheme$host$uri$is_args$args并配合map过滤掉无关参数 - Redis / Memcached 客户端:打印实际生成的 key,例如
cache:product:1001?t=1726455240就是危险信号
用响应头快速定位命中的真实性
别只信“页面加载快”,要看缓存系统是否真复用了数据:
- 观察响应头中的
X-Cache-Lookup(CDN)或X-Cache(Varnish/Nginx):连续请求若反复出现Miss from cloudfront或MISS,说明没命中 - 对比两个仅参数不同的请求(如
?v=1.0和?v=1.1)的Age值:若都为 0,基本可断定未共享缓存 - 开启调试日志(如 Redis 的
monitor命令),看相同业务逻辑是否发出了多个不同 key 的GET
模拟精简参数后验证效果
临时绕过前端,用 curl 构造干净 URL 测试缓存行为:
- 原始请求:
curl -I "https://cdn.example.com/img/logo.png?v=1.2.3&t=1726455240"→ 查看X-Cache是否 Miss - 精简请求:
curl -I "https://cdn.example.com/img/logo.png?v=1.2.3"→ 若变成 Hit,说明t=...是罪魁祸首 - 再试:
curl -I "https://cdn.example.com/img/logo.png?v=1.2.4"→ 若仍是 Miss,说明v参数本身也被纳入了缓存键(需评估是否应保留)











