要排除缓存造成的假象,核心做法是让每次测量都绕开浏览器缓存、中间缓存和服务器端缓存,并对同一资源比较“带缓存”和“不带缓存”两组数据。如果两组结果差距很大,说明你之前看到的快或慢很可能来自缓存,而不是页面本身的真实表现。下面用一个假设例子说明具体步骤和常见错误。
假设你负责一个内容站,某个详情页在浏览器里打开很快,几乎瞬间出现。但用第三方测速工具跑,首字节时间却超过两秒。你没有改动代码,第二天再测,工具结果又变快了。
这个现象有多个可能解释:可能是浏览器缓存了 HTML 和静态资源,可能是 CDN 边缘节点缓存了页面,也可能是服务端对象缓存生效,还可能是测速工具本身复用了上一次的会话。不能直接断言“就是缓存问题”,但可以通过下面的步骤逐项排除。
浏览器开发者工具的 Network 面板里,勾选 Disable cache,然后强制刷新。这一步能绕开浏览器本地缓存,但绕不开 CDN 和服务器缓存。要得到更接近源站的基准,可以:
?nocache=1,前提是服务器不会因为这个参数改变页面内容。Cache-Control: no-cache 和 Pragma: no-cache。判断结果:如果加了禁用缓存参数后,页面明显变慢,而正常访问很快,那么缓存确实在起作用。此时要区分是浏览器缓存、CDN 缓存还是服务端缓存,不能笼统归为“缓存问题”。
打开开发者工具的 Network 面板,点击主文档请求,查看 Response Headers。重点看这几个字段:
Cache-Control:是否包含 max-age、s-maxage、no-store 等指令。Age:如果存在且大于 0,通常说明响应来自共享缓存,比如 CDN 或反向代理。X-Cache、CF-Cache-Status 等自定义头:不同服务商命名不同,需要分别核查其含义,不能凭字段名猜测。ETag 和 Last-Modified:用于协商缓存,第二次请求可能返回 304,看起来很快,但并未真正传输完整内容。常见错误是只看总耗时,不看请求是否命中缓存。304 响应不代表页面渲染快,只代表服务器认为本地副本仍可用。
把同一页面的两组数据放在一起对比:
如果第一组明显更长,说明缓存确实掩盖了真实成本。但还要继续判断:第一组慢是因为 HTML 文档生成慢,还是因为图片、脚本等静态资源没有缓存?可以在 Network 面板按资源类型排序,分别看文档、样式、脚本、图片的耗时。
如果禁用缓存后依然很快,那缓存假象就不是主因,应该继续排查服务端处理、数据库查询或第三方脚本。此时不要继续在缓存上打转。
下一步建议:选一个你怀疑被缓存掩盖的真实页面,按“禁用缓存请求 → 查看响应头 → 对比两组耗时”的顺序记录一次数据。如果禁用缓存后耗时变化不大,就把排查方向转向服务端和资源加载;如果变化很大,再逐层确认是浏览器、CDN 还是服务端缓存,并分别制定清理或缩短缓存时间的策略。