强缓存和协商缓存

26 年 2 月 24 日 星期二
411 字
3 分钟

强缓存和协商缓存的区别

类型是否发请求控制字段
强缓存❌ 不发请求Cache-Control / Expires
协商缓存✅ 发请求(带验证头)ETag / Last-Modified

一、强缓存(Strong Cache)

1️⃣ 定义

浏览器直接使用本地缓存,不向服务器发送请求。

2️⃣ 控制字段

✅ Cache-Control(HTTP/1.1,推荐)

http
Cache-Control: max-age=3600

含义:

资源在 3600 秒内直接使用本地缓存

常见指令:

指令含义
max-age=秒有效时间
private仅浏览器可缓存
no-store完全不缓存
public所有缓存可用
no-cache必须走协商缓存

✅ Expires(HTTP/1.0,已过时)

http
Expires: Wed, 21 Oct 2026 07:28:00 GMT

问题:

  • 依赖客户端时间
  • 优先级低于 Cache-Control

3️⃣ 强缓存流程

text
第一次请求 → 服务器返回 max-age=3600
第二次请求(3600秒内) → 浏览器直接用缓存

服务器完全不知道这次访问。


二、协商缓存(Negotiation Cache)

1️⃣ 定义

浏览器会发请求,但带验证字段。

服务器返回:

  • 304 → 资源没变,用缓存
  • 200 → 资源变了,返回新内容

2️⃣ 两种验证机制


🔹 1)Last-Modified + If-Modified-Since

浏览器再次请求:

http
If-Modified-Since: Mon, 24 Feb 2026 10:00:00 GMT

服务器返回:

http
Last-Modified: Mon, 24 Feb 2026 10:00:00 GMT

服务器判断文件是否修改:

  • 没改 → 304
  • 改了 → 200

缺点

  • 精度是秒
  • 文件内容没变但时间变了也会失效

🔹 2)ETag + If-None-Match(更精确)

浏览器请求:

http
If-None-Match: "abc123"

服务器返回:

http
ETag: "abc123"

服务器对比 hash:

  • 相同 → 304
  • 不同 → 200

优点

  • 精确到内容
  • 不受时间影响

缺点

  • 服务器要计算 hash
  • 分布式部署要注意一致性

文章标题:强缓存和协商缓存

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/%E5%BC%BA%E7%BC%93%E5%AD%98%E5%92%8C%E5%8D%8F%E5%95%86%E7%BC%93%E5%AD%98[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。