HTTP 缓存是一种存储技术,用于临时保存 Web 资源副本,以减少网络请求、提高页面加载速度和减轻服务器负载。
1. 缓存类型
浏览器缓存(Browser Cache)
- 私有缓存:存储在用户本地浏览器中
- 内存缓存:存储在 RAM 中,速度最快,关闭标签页即失效
- 磁盘缓存:存储在硬盘中,持久化保存
代理缓存(Proxy Cache)
- 共享缓存:位于客户端和服务器之间
- 企业代理:公司内部网络代理
- ISP 缓存:互联网服务提供商的缓存
CDN 缓存(Content Delivery Network)
- 边缘缓存:分布在全球各地的缓存节点
- 地理位置优化:就近提供内容服务
- 负载分担:减轻源服务器压力
2. 关键 HTTP 缓存头部
Cache-Control(缓存控制)
Cache-Control: max-age=3600, public
Cache-Control: no-cache, no-store, must-revalidate指令说明:
max-age=<seconds>:缓存有效期(秒)public:可被任何缓存存储private:只能被浏览器缓存no-cache:必须验证后才能使用缓存no-store:禁止存储缓存must-revalidate:过期后必须重新验证
Expires(过期时间)
Expires: Wed, 21 Oct 2024 07:28:00 GMT- HTTP/1.0 时代的缓存控制
- 绝对时间,易受客户端时间影响
Cache-Control优先级更高
ETag(实体标签)
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"- 资源的唯一标识符
- 强验证:
"value" - 弱验证:
W/"value"
Last-Modified(最后修改时间)
Last-Modified: Wed, 21 Oct 2024 07:28:00 GMT- 资源最后修改的时间戳
- 精度只能到秒级
- ETag 优先级更高
If-None-Match / If-Modified-Since(条件请求)
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
If-Modified-Since: Wed, 21 Oct 2024 07:28:00 GMT- 用于缓存验证
- 304 Not Modified 响应
3. 缓存策略和验证机制
强缓存(Strong Cache)
特点:
- 直接从缓存中获取资源,不发送请求到服务器
- 基于
Cache-Control或Expires头部 - 状态码:200 (from cache)
流程:
- 检查缓存是否存在
- 检查缓存是否过期
- 未过期则直接使用缓存
协商缓存(Negotiation Cache)
特点:
- 向服务器发送验证请求
- 基于
ETag或Last-Modified头部 - 状态码:304 Not Modified 或 200
流程:
- 缓存过期或设置了
no-cache - 发送条件请求到服务器
- 服务器验证资源是否变更
- 未变更返回 304,变更返回新资源
缓存优先级
- Cache-Control > Expires
- ETag > Last-Modified
- 强缓存 > 协商缓存
缓存失效策略
- 主动失效:更新资源版本号
- 被动失效:设置合理的过期时间
- 条件失效:使用 ETag 或 Last-Modified
HTTP 缓存是 Web 性能优化的重要手段,合理配置可以显著提升用户体验和减少服务器负载。关键是根据资源特性选择合适的缓存策略,并结合版本控制确保内容的及时更新。