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-Match | ETag 相同 | 412 |
If-None-Match | ETag 不同 | 412, 常用于避免覆盖写入 |
If-Modified-Since | 资源在该时间之后已更新 | 未更新则返回 304 |
If-Unmodified-Since | 资源在该时间之后未更新 | 412 |
If-Range | ETag 相同则按范围返回 | 返回完整资源 |
强缓存与协商缓存分别适合什么场景?
- 强缓存: 静态文件、不敏感且不常变化的资源; 无须通信, 响应最快;
- 协商缓存: 频繁变动的实时数据、需要验证有效性的资源; 精度高但需计算文件哈希, 性能开销更大;
浏览器有哪些缓存位置?
| 位置 | 特点 |
|---|---|
| Service Worker | 独立线程中的缓存 |
| Memory Cache | 会话数据 |
| Disk Cache | 持久性数据, 用于强缓存与协商缓存 |
| Push Cache | 会话数据, 存放 HTTP/2 推送的内容 |
- 强缓存与协商缓存都由 Disk Cache 承载;