-
缓存策略
-
强制缓存
-
Expires
- 表示资源过期的绝对时间
-
Cache-Control
-
控制策略
- max-age
- 表示资源过期的相对时间(秒)
- no-cache
- 禁止终端保留缓存副本,强制要求每次请求直接发送到源服务器(可以使用协商缓存)
- no-store
- 任何情况下都不要保留任何副本
- public
- 任何途径(如本地缓存、代理服务器、CDN 等)可以无条件的缓存该资源
- private
- 只能被终端用户或实体缓存
- HTTP 1.1 引入
-
两者对比
- Expires 只能表示绝对时间,当请求的两个终端时间不一致时会导致缓存失效
- Cache-Control 提供了丰富的缓存策略,如通过 max-age 指定资源过期的相对时间
-
协商缓存
-
Last-Modified / If-Modified-Since
- Last-Modified 语义是最后修改时间(秒),根据该值和 If-Modified-Since 比较的结果,如果相等则命中缓存,返回 304;否则返回 200、响应和新的 Last-Modified
-
ETag / If-None-Match
- 由服务器生成的请求资源的唯一标识符,只要资源有变化则生成新的 ETag,根据该值和 If-None-Match 比较的结果,如果一致则命中缓存,返回 304;否则返回 200、响应和新的 ETag
- HTTP 1.1 引入
-
两者对比
- ETag 精度更高,Last-Modified 只能精确到秒
- Last-Modified 性能更好,ETag 需要计算得出
-
缓存位置
-
Service Worker
- App Cache 的替代品,配合 Cache + Fetch 能力可以用做本地缓存管理
- 可自由控制缓存哪些文件、缓存的匹配规则、如何读取缓存等
- 缓存持续时间长
-
Memory Cache
- 读取快
- 容量小
- 缓存持续时间短 - 进程 or Tab 关闭时释放
-
Disk Cache
- 读取慢
- 容量大
- 缓存持续时间长
-
Push Cache
- 缓存服务器推送过来的资源
- 缓存持续时间短 - 连接关闭时释放
- HTTP 2 引入
-
用户行为对缓存的影响
-
地址栏回车
- 页面本身的请求会带 no-cache
- 页面链接跳转
- 打开新窗口
- 前进后退
- F5 刷新
- Ctrl+F5 强制刷新
- 使用缓存
- 使用协商缓存
- 不使用缓存