网站缓存有没有生效怎么检测?缓存命中与加载速度分析
本文介绍网站缓存是否生效的检测方法,结合 Cache-Control、HIT/MISS、浏览器缓存和 TTFB,分析缓存命中情况及其对网站加载速度的实际影响。
网站已经配置了 CDN、浏览器缓存或者页面缓存,但访问速度似乎没有明显变化,这种情况不能只看后台里的缓存规则有没有开启。真正需要确认的是:用户发起请求以后,资源到底有没有从缓存中返回。
判断网站缓存是否生效,通常可以从 Cache-Control、Age、HIT/MISS 状态、重复请求结果以及 TTFB 等几个方面入手。只有把“有没有缓存”“有没有命中”和“命中后有没有变快”这几个问题分开看,才能判断缓存配置究竟有没有发挥作用。
本文就从实际检测角度,讲清楚网站缓存怎么查、HIT 和 MISS 分别代表什么,以及缓存已经命中但网站仍然很慢时应该继续检查哪些地方。

一、网站缓存怎样才算是生效?
平时说的网站缓存,其实并不只有一种,从用户访问网站的整个链路来看,缓存可能存在于浏览器、CDN 边缘节点、Web 服务器甚至网站应用内部。
例如:
浏览器缓存图片、CSS、JavaScript 等静态文件;
CDN 将源站资源缓存到离用户更近的边缘节点;
Nginx、Varnish 等服务器缓存页面或接口响应;
WordPress 等 CMS 使用页面缓存插件;
Redis、Memcached 缓存数据库查询结果。
对于普通站长来说,实际检测时最常关注的是两件事。
第一,浏览器是不是还在重复下载相同的资源。
第二,使用 CDN 后,请求有没有真正命中 CDN 缓存,而不是每次都重新回源。
这两个问题虽然都属于“缓存”,但检测方式并不完全一样。
另外需要注意,网站打开速度变快,并不能单独证明缓存已经命中;反过来,某个资源显示 HIT,也不代表整个网页一定很快。
缓存只是网站性能链路中的一个环节,所以检测时最好把缓存状态和真实加载时间放在一起看。
二、网站缓存有没有生效?先看响应头
最直接的检测方法,是查看网站资源返回的 HTTP Response Headers。
以 Chrome 为例,可以打开需要测试的网页,然后按下 F12 进入开发者工具,切换到:
Network → 选择一个资源 → Headers → Response Headers
建议先查看图片、CSS、JavaScript 这类静态资源,因为它们通常最容易配置缓存。
1. 查看 Cache-Control
Cache-Control 是判断缓存策略时最常见的响应头之一。
例如:
Cache-Control: public, max-age=86400其中:
public表示这个响应允许被共享缓存保存;
max-age=86400表示缓存有效期为 86400 秒,也就是 24 小时。
这说明服务器已经明确告诉浏览器或中间缓存节点:这个资源可以在一定时间内缓存。
另外还可能看到:
Cache-Control: no-cache或者:
Cache-Control: no-store这两个经常被混在一起理解,但实际上含义并不一样。
no-cache并不等于完全禁止保存缓存,而是再次使用缓存内容之前,通常需要先向服务器验证资源是否仍然有效。
no-store则更加严格,一般表示不应该保存该响应内容。
所以检查缓存时,不能看到no-cache就直接判断“网站没有缓存”,还要结合其他响应头以及实际请求状态一起分析。
2. 查看 Age
如果网站使用 CDN,可以继续留意响应头中有没有Age。
例如:
Age: 328通常可以理解为,这个资源已经在某个共享缓存中保存了 328 秒。
过一段时间重新请求同一个资源,如果看到:
Age: 356数值仍然在增加,说明该资源很可能一直保存在缓存节点中,并没有重新从源站完整获取。
不过,不是所有 CDN 都会返回 Age,也不能只凭 Age 一个字段判断整个缓存系统是否正常。
不同 CDN 的缓存状态字段、规则以及返回方式都有差异,所以最好继续结合 HIT、MISS 等结果来看。
三、HIT 和 MISS 怎么看?
对于 CDN 缓存来说,HIT 和 MISS 是最常见、也最容易理解的两个状态。
不同服务商使用的 Header 名称可能不一样,例如:
X-Cache: HIT或者:
CF-Cache-Status: HIT虽然字段不同,但判断思路基本一致。
HIT
HIT 一般表示当前请求已经命中缓存。
也就是说,CDN 节点上已经存在可用的资源副本,请求可以直接从缓存返回,不需要重新向源站获取完整内容。
对于图片、CSS、JavaScript、下载文件等静态资源来说,正常命中缓存以后,通常可以明显减少源站压力。
MISS
MISS 表示当前缓存节点暂时没有可直接使用的缓存内容,因此通常需要向源站获取。
不过,一次 MISS 并不能说明缓存配置失败。
例如某个 CDN 节点第一次收到这个 URL 的访问请求时,本地本来就可能没有缓存。第一次访问先回源,资源被缓存下来以后,第二次请求才可能变成 HIT。
所以真正值得关注的是:
相同资源连续访问多次以后,仍然一直 MISS。
这种情况才需要进一步检查缓存规则。
除了 HIT 和 MISS,还可能看到一些其他状态。
缓存状态 | 常见含义 |
|---|---|
HIT | 已经命中缓存 |
MISS | 当前没有可用缓存,需要回源 |
EXPIRED | 原有缓存已经过期 |
BYPASS | 当前请求绕过缓存 |
DYNAMIC | 动态内容,通常没有按照普通静态资源方式缓存 |
需要注意的是,不同 CDN 对这些状态的定义可能存在差异。如果要精确判断,最好同时查看对应服务商的缓存规则。
四、连续请求两次,比只看一次结果更有意义
实际检测网站缓存时,我一般不建议只请求一次资源就下结论。
假设测试的是:
https://www.example.com/static/app.js第一次访问时看到:
X-Cache: MISS
TTFB: 186ms这时候并不能马上认为缓存没有生效。
重新请求一次相同 URL,如果结果变成:
X-Cache: HIT
TTFB: 38ms这种情况反而说明缓存工作得比较正常。
第一次请求时,CDN 节点没有该文件,需要回源读取;资源被保存以后,第二次访问直接从边缘缓存返回,因此首字节响应时间明显降低。
如果连续刷新多次以后依然是:
X-Cache: MISS这时候再重点检查:
资源是否允许缓存;
CDN 缓存规则有没有覆盖这个 URL;
TTL 是否设置得太短;
Cookie 是否导致绕过缓存;
URL 参数是否一直发生变化。
“第一次 MISS、第二次 HIT”是很正常的情况,不能把一次 MISS 当成缓存异常。
五、怎么判断浏览器缓存有没有生效?
CDN 缓存和浏览器缓存不是一回事:CDN 缓存发生在网站服务器和用户之间,而浏览器缓存发生在用户本机,即使 CDN 已经 HIT,如果浏览器每次刷新仍然重新下载大量静态资源,页面加载效率依然可能受到影响。
在 Chrome 中打开:
F12 → Network
然后正常刷新网页,查看图片、CSS、JavaScript 等资源,在 Size 或 Transferred 一栏中,有时会看到:(memory cache)或者:(disk cache)。
memory cache一般表示资源直接从浏览器内存中读取;disk cache则表示浏览器从本地磁盘缓存中读取。这种情况下,浏览器通常不需要重新完整下载该文件。
检测时还有一个很容易被忽略的细节:Chrome 开发者工具的 Network 面板中有一个:Disable cache,如果这个选项被勾选,只要开发者工具保持打开状态,浏览器缓存就可能被临时禁用。
很多人在测试缓存时一边勾着 Disable cache,一边反复刷新,然后发现资源始终重新请求,最后误以为缓存没有生效。
所以测试浏览器缓存之前,最好先确认这个选项的状态。
六、缓存命中以后,还要看 TTFB 有没有变化
判断缓存有没有价值,不能只停留在“显示 HIT 了”。
真正需要观察的是:HIT 以后,请求速度有没有改善。
比如同一个静态文件第一次测试:
Cache: MISS
TTFB: 220ms再次请求:
Cache: HIT
TTFB: 42ms这种变化比较典型。
说明第一次访问需要经过 CDN 回源,第二次已经可以直接从缓存节点返回,减少了回源链路,所以 TTFB 明显下降。
但如果实际结果是:
MISS:TTFB 180ms
HIT:TTFB 165ms虽然缓存状态已经从 MISS 变成 HIT,但对这次访问来说,实际响应时间并没有改善多少。
这种情况下就不能继续把注意力全部放在缓存配置上,而应该检查其他因素。
例如:
CDN 节点距离用户是不是太远;
当前运营商线路质量是否较差;
DNS 解析是否合理;
HTTPS/TLS 建连是否耗时;
静态文件是不是过大;
页面本身是不是还有大量第三方请求。
所以检测缓存最好遵循一个原则:
先看是否 HIT,再看 HIT 以后到底快了多少。
只有这两个结果同时成立,才能说明缓存不只是“配置上生效”,而是在真实访问中发挥了作用。
七、缓存调整以后,可以重新测试网站整体速度
浏览器开发者工具更适合分析某个具体资源有没有缓存,而网站测速则更适合观察缓存调整以后,整体访问性能是否真的发生变化。
例如修改了以下配置:
延长图片缓存时间;
调整 CSS、JS 的 Cache-Control;
修改 CDN 缓存规则;
增加静态资源缓存范围;
清理旧缓存后重新建立缓存。
调整完成后,可以使用 Chahu 对网站重新进行测速,观察实际网站响应和不同网络环境下的访问速度变化。
这时候重点不是单独看一次测速数字,而是对比调整前后的结果。
例如原来部分地区网站响应时间较高,缓存策略调整以后明显下降,说明这次优化确实对真实访问产生了效果。
如果缓存已经正常 HIT,但测速时部分地区仍然明显偏慢,那么问题可能并不在缓存。
接下来就应该继续检查:DNS解析、网络线路、CDN节点、源站响应以及页面资源本身。
这种方式比单纯盯着一个 HIT 状态更有意义,因为最终用户感受到的是网页加载速度,而不是后台里的某个缓存字段。
八、网站缓存可以按照这个顺序检测
如果只是想快速判断网站缓存有没有真正生效,可以按照下面这个顺序检查。
第一步:看 Cache-Control
先确认需要缓存的资源有没有合理的缓存策略。
第二步:看缓存状态
查看 CDN 返回的 HIT、MISS、Age、BYPASS 等信息。
第三步:连续请求同一个 URL
不要只根据第一次访问判断缓存是否正常。
第四步:比较 TTFB
观察从 MISS 变成 HIT 以后,实际响应时间有没有明显下降。
第五步:检查浏览器缓存
确认静态资源有没有从 memory cache 或 disk cache 中读取。
第六步:重新测试网站整体速度
缓存策略调整以后,再观察不同地区和网络环境下的网站访问速度是否改善:如果缓存已经正常 HIT,但网站仍然很慢,就不要继续反复修改缓存规则,而应该把排查范围扩展到 DNS、网络线路、CDN节点、源站响应以及页面资源。
结语
判断网站缓存有没有生效,不能只看后台有没有打开“缓存”开关,也不能只凭网页感觉比以前快了一点。更可靠的方法,是从实际请求入手:先确认 Cache-Control 等缓存策略有没有正确返回,再观察 CDN 请求是 HIT 还是 MISS;连续测试相同资源后,再比较缓存命中前后的 TTFB 和实际加载时间。
如果资源已经正常 HIT,而且命中后的响应时间明显下降,基本可以确认缓存正在发挥作用。如果缓存状态正常,但网站整体依然很慢,问题往往已经不在缓存本身。继续检查源站响应、网络线路、DNS、文件大小以及第三方资源,通常比反复调整缓存规则更容易找到真正的性能瓶颈。
相关问答
1. 为什么网站在 CDN 设置了强缓存,通过 Python 脚本或 Curl 抓取时依然频繁返回 MISS?
这通常是因为自动化脚本在发起 HTTP 请求时,默认带上了与真实浏览器不同的 Request Headers(如缺少Accept-Encoding: gzip, br,或者包含了特殊的User-Agent和Cookie)。很多 CDN 节点在处理缓存键时,会将请求头中的压缩支持情况或 Query String 计算在内。当脚本发起的请求特征与边缘节点已缓存的版本不匹配时,CDN 会认定为全新的请求并触发回源。测试时建议使用curl -I -H "Accept-Encoding: gzip, deflate, br"模拟标准浏览器的 HTTP 请求头。
2. 开启了 Nginx 的proxy_cache后,明明设置了静态资源缓存,为什么日志里总是出现EXPIRED?
EXPIRED意味着 CDN 或反向代理节点上确实存在该资源的缓存文件,但它的生存时间(TTL)已经超过了规则指定的有效期。产生这一现象通常有两个原因:一是 Nginx 配置中的proxy_cache_valid设置的时间过短;二是源站 HTTP 响应头中自带的Cache-Control: max-age或Expires数值较小,覆盖了代理服务器的本地默认缓存策略。此时节点会带上验证头回源,如果源站内容未变则重新刷新该缓存块的生命周期。
3. 页面使用了 HTML 页面级缓存(如 Edge Page Cache),发布新内容后如何做到让特定页面瞬间失效?
全页缓存虽然能极大降低首字节响应时间(TTFB),但更新不及时会引发业务问题。纯靠等待 TTL 自然过期效率太低,行业内通用做法是通过 API 触发主动缓存 Purge或 Invalidate。Purge 会直接删除节点上的物理文件,下一次访问强制回源;Invalidate 则将缓存标记为过期,在后台异步回源更新的同时,仍可选择性地向用户响应旧版本(Stale-While-Revalidate 机制),以保证页面无缝加载。
4. 为什么 HTTP/2 或 HTTP/3 协议下,即使没有命中浏览器本地缓存,首屏加载速度也可能没有明显延迟?
在 HTTP/1.1 时代,浏览器对同一域名的并发连接数有限制(通常为 6 个),如果静态资源未命中本地缓存,很容易引发队头阻塞(Head-of-Line Blocking)。而在 HTTP/2 和 HTTP/3 中,引入了多路复用(Multiplexing)和 QUIC 协议,所有请求可以在同一个 TCP/UDP 链接中并行传输。即便资源触发了 CDN 节点响应而非浏览器本地磁盘读取,极低的传输建连开销也会在视觉体验上掩盖掉部分未命中的延迟。
5. 源站在响应头中设置了Set-Cookie,为什么会导致 CDN 节点直接跳过缓存?
为了防止用户的敏感私密数据(如登录态 Session、个人购物车信息)被 CDN 错误地缓存并分发给其他访客,大部分 CDN 供应商都设置了严格的安全防护机制:只要检测到源站响应头里带有Set-Cookie字段,该请求就会被强制标记为BYPASS或PRIVATE,绝不写入公共节点存储。如果图片或 CSS 等静态资源被错误地注入了 Cookie,需要检查源站服务器或 CMS 插件,剥离静态资源的Set-Cookie返回。



