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