「我们的缓存命中率 95%」,这句话经常经不起一次实测。

因为后台的统计口径,往往把图片、JS 和 HTML 混在一起算。图片命中率高,会掩盖 HTML 根本没缓存的事实。

最直接的办法:连测两次

同一个 URL,隔一两分钟测两次。

第二次明显快,说明第一次把缓存打热了——也就是说,之前是未命中。每次都一样慢,说明缓存根本没生效。

这个办法不需要后台权限,但很有效。

看响应头

不同 CDN 的标记不一样:X-Cache: HIT/MISS、CF-Cache-Status、Age。

Age 大于 0,说明这份内容在边缘节点待了多久,基本可以确认命中了。Age: 0 或者没有这个头,多半是回源拿的。

为什么 HTML 经常不缓存

三个常见原因:响应头带了 Cache-Control: no-store;页面里有 Set-Cookie;URL 带随机参数,导致缓存键每次都不同。

还有一个隐蔽的:CDN 默认不缓存 HTML,需要手动配置规则。很多人以为开了 CDN 就自动缓存,其实只缓存了静态资源。

命中率低的代价

每一次未命中都是一次回源。回源意味着用户要等「边缘到源站」这一整段,跨省几十毫秒,跨境几百毫秒。

大促的时候,回源流量还会把源站打满,表现从慢变成 502。

怎么改

静态资源加长缓存时间并带 hash 文件名。HTML 用较短的缓存时间,配合 CDN 的缓存规则。动态接口不缓存,但要确保不被误缓存。

验证效果

改完再连测两次,对比第一次和第二次的耗时差。差值缩小,说明命中率上来了。

想确认边缘和源站的真实差距,用高级选项里的指定解析直接测源站,再正常测一次,两个数一减就是回源成本。入口在 网站测速。