跳到主要内容

HTTP 缓存机制

缓存的作用与刷新时机是什么?​

  • 缓存: 服务端资源在客户端或代理服务器上的副本;
  • 作用: 减少对源服务器的访问, 降低通信流量与响应时间;
  • 刷新: 到达缓存有效期限, 或客户端主动要求时, 缓存再次向源服务器请求并更新副本;

强缓存靠哪些字段判定?​

  • 命中强缓存时直接使用本地副本, 不与服务器通信;
  • Expires: HTTP/1.0 字段, 指定绝对过期时间; 依赖客户端时钟, 时间不一致时判定失真, HTTP/1.1 中废弃;
  • Cache-Control: HTTP/1.1 字段, 用相对时间描述行为, 常用 max-age;
    • public 允许浏览器与代理缓存, private 只允许浏览器缓存;
    • no-cache 跳过强缓存进入协商缓存, no-store 完全不缓存;
  • 优先级: Cache-Control 高于 Expires;
Cache-Control: public, max-age=86400

协商缓存如何向服务器验证资源?​

  • 触发: 强缓存失效后, 浏览器携带验证字段请求服务器, 由服务器决定能否继续使用缓存;
  • Last-Modified / If-Modified-Since:
    • 首次响应携带 Last-Modified;
    • 再次请求时把它写入 If-Modified-Since;
    • 资源未变化返回 304, 已变化返回 200 与新资源;
    • 精度只到秒, 文件在 1 秒内多次变化无法识别;
  • ETag / If-None-Match:
    • 服务器对资源做哈希生成 ETag 并随响应下发;
    • 再次请求时把它写入 If-None-Match;
    • 两者相同返回 304, 不同返回 200 与新资源;
  • 优先级: If-None-Match 高于 If-Modified-Since;

其他条件请求字段的语义是什么?​

字段命中条件不满足时
If-MatchETag 相同412
If-None-MatchETag 不同412, 常用于避免覆盖写入
If-Modified-Since资源在该时间之后已更新未更新则返回 304
If-Unmodified-Since资源在该时间之后未更新412
If-RangeETag 相同则按范围返回返回完整资源

强缓存与协商缓存分别适合什么场景?​

  • 强缓存: 静态文件、不敏感且不常变化的资源; 无须通信, 响应最快;
  • 协商缓存: 频繁变动的实时数据、需要验证有效性的资源; 精度高但需计算文件哈希, 性能开销更大;

浏览器有哪些缓存位置?​

位置特点
Service Worker独立线程中的缓存
Memory Cache会话数据
Disk Cache持久性数据, 用于强缓存与协商缓存
Push Cache会话数据, 存放 HTTP/2 推送的内容
  • 强缓存与协商缓存都由 Disk Cache 承载;