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-ControlExpires 头部
  • 状态码:200 (from cache)

流程:

  1. 检查缓存是否存在
  2. 检查缓存是否过期
  3. 未过期则直接使用缓存

协商缓存(Negotiation Cache)

特点:

  • 向服务器发送验证请求
  • 基于 ETagLast-Modified 头部
  • 状态码:304 Not Modified 或 200

流程:

  1. 缓存过期或设置了 no-cache
  2. 发送条件请求到服务器
  3. 服务器验证资源是否变更
  4. 未变更返回 304,变更返回新资源

缓存优先级

  1. Cache-Control > Expires
  2. ETag > Last-Modified
  3. 强缓存 > 协商缓存

缓存失效策略

  • 主动失效:更新资源版本号
  • 被动失效:设置合理的过期时间
  • 条件失效:使用 ETag 或 Last-Modified

HTTP 缓存是 Web 性能优化的重要手段,合理配置可以显著提升用户体验和减少服务器负载。关键是根据资源特性选择合适的缓存策略,并结合版本控制确保内容的及时更新。