真实面经题目 · 原创解析
强缓存和协商缓存有什么区别?
强缓存和协商缓存的根本区别在于是否向服务器发请求。强缓存有效时浏览器直接使用本地副本;协商缓存需要发条件请求,由服务器判断资源是否变化,未变化返回 304。
真实面经题目 · 原创解析
强缓存和协商缓存的根本区别在于是否向服务器发请求。强缓存有效时浏览器直接使用本地副本;协商缓存需要发条件请求,由服务器判断资源是否变化,未变化返回 304。
强缓存是浏览器根据 Cache-Control 或 Expires 判断资源仍在有效期内,就直接从本地缓存读取,不产生网络请求,也不会询问服务器。协商缓存是在强缓存过期、Cache-Control: no-cache 或用户刷新等场景下触发,浏览器带 If-None-Match 或 If-Modified-Since 向服务器验证资源是否变化;未变化返回 304,浏览器复用本地内容,变化则返回 200 和新资源。两者不是互斥的两套孤立机制,而是同一缓存流程的前后阶段:先判断强缓存是否可用,不可用再进入协商。强缓存速度最快但容易拿旧内容,协商缓存多一次请求但能保证资源新鲜度更可控。
强缓存命中时,浏览器不会向服务器发送请求,资源直接从内存缓存或磁盘缓存读取。协商缓存一定会发请求,只是请求可能很轻量;服务器返回 304 时不返回完整响应体,浏览器继续使用本地副本。这是两者最核心的差异。
强缓存看本地有效期,主要由 Cache-Control 的 max-age、s-maxage 或 Expires 决定。协商缓存看资源是否变化,主要由 ETag/If-None-Match 或 Last-Modified/If-Modified-Since 决定。前者回答“还能不能直接用”,后者回答“服务器上的内容有没有变”。
强缓存性能最好,省掉网络往返和服务器计算,适合 URL 带版本指纹的静态资源。协商缓存多一次网络往返,但能让服务器确认资源状态,适合入口 HTML、接口响应或不方便改变 URL 的资源。缓存策略本质是在速度和内容新鲜度之间平衡。
强缓存命中通常在开发者工具里看到 memory cache 或 disk cache,状态码可能显示为本地缓存来源,并没有真实请求。协商缓存未变化时会收到真实的 304 响应,变化时收到 200 和新内容。看到 304 就说明已经经过服务器验证。
现代站点通常组合使用:构建产物文件名带 hash,设置长期强缓存;HTML 入口设置 no-cache 或短 max-age,保证能及时发现新资源引用;接口按业务一致性决定 no-store、短缓存或协商。不同资源一刀切会带来版本滞后或缓存收益不足。
普通刷新通常会让浏览器重新验证缓存,很多资源会进入协商缓存;强制刷新往往绕过缓存重新请求资源。不同浏览器细节可能不同,但核心是用户刷新会降低强缓存直接复用的概率。
文件 hash 让资源内容和 URL 绑定。内容不变时 URL 不变,可以安全长期强缓存;内容变化时 URL 变化,浏览器会请求新文件。这样兼顾访问速度和版本更新。
不是。304 通常不返回完整内容,节省传输体积,但仍然有网络往返、请求排队、服务器校验和响应头传输成本。相比强缓存,它仍然慢一些。
可以,但要看业务一致性。公共且短时间稳定的数据可以短 max-age;用户隐私、余额、订单状态等敏感或强实时数据不应随意强缓存,可能需要 no-store 或严格校验。