HTTP缓存强缓存与协商缓存

HTTP缓存(强缓存与协商缓存·补充)

本篇是 HTTP基础强缓存 vs 协商缓存补充速览,请求头速查已并入 HTTP基础,深度原理看上面两篇。

4.1 HTTP缓存(减少请求,提速)

两类缓存,靠请求头+响应头配合控制。

1)强缓存(不发请求)

资源没过期,直接读本地文件,连请求都不发。状态码 200 (from cache)

控制头:

  • Cache-Control: max-age=3600(缓存1小时,优先级高)

  • Expires: Thu, 01 Jan 2025 00:00:00 GMT(过期时间点,已过时)

2)协商缓存(发请求校验)

强缓存过期了,发请求问服务器资源更新没。

  • 未更新 → 返回 304,继续用本地缓存
  • 已更新 → 返回 200 + 新资源

两组校验规则:

方式请求头响应头原理
时间校验If-Modified-SinceLast-Modified对比文件最后修改时间
指纹校验If-None-MatchETag对比文件内容的唯一指纹(MD5等)

ETag比修改时间更精准:文件内容微调但修改时间不变,ETag能识别出来。

缓存流程图


flowchart TD

    A["浏览器请求资源"] --> B{"强缓存有效?<br/>Cache-Control/Expires"}

    B -->|"是"| C["直接用本地缓存<br/>200 from cache ✅"]

    B -->|"否"| D["发请求<br/>带 If-None-Match / If-Modified-Since"]

    D --> E{"服务器对比<br/>资源变了没?"}

    E -->|"没变"| F["返回 304<br/>继续用本地缓存 ✅"]

    E -->|"变了"| G["返回 200 + 新资源<br/>更新本地缓存 🔄"]

❗ 易错点

304不是报错,是优化 — 说明缓存还能用,省了重新下载的流量和时间。


速记卡(面试闪卡)

Q1:一句话讲清「HTTP缓存强缓存与协商缓存」到底是什么?

A:HTTP 缓存就是”能不重新下载就别下载”:强缓存有效期内连请求都不发,协商缓存过期才问服务器”变没变”。

Q2:强缓存怎么理解 —— 怎么理解?

A:像冰箱里的剩饭:资源没过期,浏览器连门都不出(不发请求),直接拿本地文件,状态码 200 (from cache)。靠 Cache-Control: max-age(缓存 1 小时,现主流)和老旧的 Expires(绝对时间点)控制。

Q3:协商缓存怎么理解 —— 怎么理解?

A:像打电话问饭店”这饭还能吃吗”:强缓存过期后,浏览器带 If-None-Match / If-Modified-Since 去问服务器。时间派用 Last-Modified 比修改时间;指纹派用 ETag(Entity Tag 实体标签)比内容哈希,更精准。

Q4:304 是报错吗 —— 怎么理解?

A:大错特错,304 是”优化”不是报错!意思是”你本地缓存还能用,我就不重传了”,省了下载流量和时间。新手看到 3xx 以为出问题,其实 304 正是缓存生效、帮用户省流量的标志。

Q5:强缓存和协商缓存怎么配合 —— 怎么理解?

A:决策像过两道关:先看强缓存(Cache-Control / Expires)有效吗?有效就闷头用、连请求都不发;无效才进协商缓存,带指纹去问服务器,回 304 接着用或 200 换新。一句话:强缓存”闷头用”,协商缓存”问一句”。

Q6:核心速记主线有哪些?

  • 强缓存不发请求:Cache-Control: max-age 优先,Expires 已过时

  • 协商缓存发请求校验:ETag 指纹 vs Last-Modified 时间

  • 304 是优化不是报错:省重新下载的流量

  • 决策流:强缓存优先、失效再协商;ETag 比修改时间精准

口诀

A:强缓存闷头用,max-age 管寿命;

过期别慌问一句,ETag 指纹最较真。

304 不是报错,是省流量报平安;

先强后协两道关,重复下载靠边站。

相关链接