前面三篇讲的缓存机制(强缓存、协商缓存、Vary),都默认在「一个缓存」上工作。但真实世界里,缓存不是一处,而是一串——从浏览器到 CDN 到反向代理到源站,每一层都可能缓存。这一篇讲清这条多级缓存链。
缓存不只一处:四层接力
一个请求从用户发出到拿到资源,中间可能经过好几个缓存:
- 浏览器缓存:最近的一层,在用户设备上。分 memory cache(内存,关页面就没)和 disk cache(磁盘,持久)。上一篇讲的强缓存和协商缓存主要在这一层。
- CDN 边缘缓存:CDN 在全球部署的边缘节点。用户请求先到最近的 CDN 节点,CDN 有缓存就直接返回,不到源站。这是离用户「第二近」的缓存。
- 反向代理缓存:源站前面的 Nginx / Varnish 等。即使请求穿过了 CDN 到了源站机房,反向代理这一层还能再挡一道。
- 源站:没有缓存,真正生成内容的地方。
这条链是接力关系:每一层都尽量自己扛,扛不住才传给下一层。浏览器命中就不用问 CDN,CDN 命中就不用问源站。这就是为什么 CDN 能极大降低源站压力——绝大多数请求在 CDN 边缘就被拦下了。
age 头:追踪资源几岁了
多层缓存的引入带来一个问题:一个资源可能在某个 CDN 节点存了 10 分钟,在另一个节点存了 1 小时。怎么追踪「这个缓存副本到底存了多久」?
HTTP 用 Age 头来回答。Age: 600 表示「这个响应已经在中间缓存里存了 600 秒」。CDN 返回响应时会带上 Age,客户端据此知道这个副本的真实年龄。
理解 age 的关键是它和 max-age、Date 的关系:
Date:响应在源站生成的时间。Age:响应在缓存层停留的总时间。max-age:资源的有效期(从源站生成算起)。
资源是否过期,看的是 当前时间 - Date - Age > max-age 吗?不是。规范的判断是:资源在每一跳的剩余有效期 = max-age - Age。如果 Age 已经超过 max-age,这个缓存副本就过期了,要向上一级验证。
这解释了一个现象:你设置 max-age=3600(1 小时),但资源在 CDN 存了 50 分钟才到浏览器,那浏览器眼里这个资源的剩余有效期只有 10 分钟,不是 1 小时。Age 让每一层缓存都基于「资源真实年龄」判断,而不是各自重新计时。
每一层的缓存策略不同
不同层缓存的目标和策略不同:
- 浏览器缓存:目标是「让用户二次访问零等待」。策略激进(带指纹资源缓存一年),但受用户清缓存影响。
- CDN 缓存:目标是「让全球用户都就近拿到」。策略看资源类型:静态资源长缓存,动态内容短缓存或不缓存。CDN 还能做主动刷新(主动失效),这是浏览器做不到的。
- 反向代理缓存:目标是「保护源站」。通常缓存 API 响应,TTL 较短(几秒到几分钟),主要为了扛突发流量。
- 源站:通常不缓存,专注生成内容。有些会用本地缓存(如 Redis)加速数据查询,但那不是 HTTP 缓存。
public 和 private:谁能缓存
Cache-Control 的 public 和 private 在多层缓存里特别重要:
public:任何缓存层都可以存(包括 CDN、代理)。适用于所有人看到的相同内容。private:只有浏览器(终端)可以存,中间代理不能存。适用于个人化内容(用户主页、个人设置),因为每个人内容不同,CDN 存了会串。
这个区分在多层缓存里是安全相关的:如果个人页面的响应没标 private,CDN 可能缓存它,导致 A 用户的个人页被 B 用户看到——又一个串内容的安全问题。
取舍与边界
多层缓存有几个实践要点:
- 缓存失效是难题。资源更新后,怎么让所有层缓存失效?带指纹的资源靠文件名变化自然失效;不带指纹的(HTML)要靠 CDN 主动刷新或短 TTL。这就是为什么 HTML 用短缓存或 no-cache——它要能及时更新。
- 调试多层缓存要分层看。响应里可能有多层缓存的状态(CDN 的
X-Cache: HIT、代理的X-Served-By),排查「为什么没更新」要逐层确认。 - CDN 的 stale-while-revalidate:CDN 后台异步刷新缓存时,先用旧的副本响应,不阻塞用户。这是 CDN 层特有的优化,浏览器也开始支持。
收束:多层缓存是性能与一致性的平衡
缓存从单点扩展到多层,是性能优化的必然——越靠近用户的缓存越快。但层级越多,一致性管理越复杂:怎么让所有层的缓存及时更新、怎么避免串内容、怎么追踪资源年龄,都是多层缓存引入的新问题。
下一篇讲缓存失效——资源更新了,旧缓存怎么清掉?哪些失效策略靠谱,哪些是坑?
关于十三Tech
我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。
我相信 AI 是程序员的最佳搭档,也希望帮助每一位开发者更好地驾驭 AI。
如果你想继续跟完这套「图解 HTTP」,欢迎关注公众号 「十三Tech」。后续会按 URL 与报文、连接与传输、缓存与协商、安全与边界、HTTP/2 与 HTTP/3 这条线更新。

