← 中文资源

简体中文版本

HTTP 缓存

HTTP 缓存存储响应并在新鲜期内复用,过期后通过 ETag 或 Last-Modified 重新验证,从而节省带宽和延迟。

阅读英文原文

工作原理

当方法是可缓存的(通常是 GET 或 HEAD)且响应允许时,缓存可以存储响应。新鲜度由 Cache-Control: max-age 或 s-maxage,或 Expires 计算。新鲜期内,缓存直接返回副本,不联系源站。

HTTP/1.1 200 OK
Cache-Control: public, max-age=60, s-maxage=600, stale-while-revalidate=30
ETag: "v42"

过期后,缓存用 If-None-Match 或 If-Modified-Since 重新验证:304 Not Modified 刷新新鲜度且不带响应体,200 则替换条目。private 阻止共享缓存存储,no-store 完全禁止存储,immutable 告诉浏览器无需再验证。

何时使用与取舍

HTTP 缓存适用于静态资源、公开内容和能容忍短暂过期的 API 读请求。带指纹的静态资源 URL 可以缓存一年;个性化或已认证响应需要 private 或 no-store,敏感数据绝不能进入共享缓存。

激进缓存降低延迟和源站负载,但会让更新可见性变差;按 URL 清除缓存在不同缓存之间不可移植。没有指纹却设置长 max-age 会把用户困在旧内容上;Vary 头可能让缓存键爆炸;反过来,到处 no-cache 会浪费协议最大的性能杠杆。每次策略变更前后都应测量命中率和源站延迟,因为浏览器、代理和 CDN 的行为并不相同。

示例与误解

经典生产事故:API 返回用户相关的 JSON 却没有 Cache-Control: private,CDN 将其缓存,下一个用户看到别人的数据。修复方式是显式缓存策略,以及检查响应头而不只是响应体的测试。相关概念:旁路缓存、缓存失效、缓存击穿。