cache

2023-06-26 loading

# 不同种类的缓存

  • 私有缓存
    • 私有缓存是绑定到特定客户端的缓存——通常是浏览器缓存
    • 如果响应包含个性化内容并且你只想将响应存储在私有缓存中,则必须指定 private 指令。
    Cache-Control: private
    
    • 如果响应具有 Authorization 标头,则不能将其存储在私有缓存(或共享缓存,除非 Cache-Control 指定的是 public)中。
  • 共享缓存: 共享缓存位于客户端和服务器之间,可以存储能在用户之间共享的响应。
    • 代理缓存
      • 除了访问控制的功能外,一些代理还实现了缓存以减少网络流量。这通常不由服务开发人员管理,因此必须由恰当的 HTTP 标头等控制。
      • Kitchen-sink 标头如下所示,用于尝试解决不理解当前 HTTP 缓存规范指令(如 no-store)的“旧且未更新的代理缓存”的实现。
      Cache-Control: no-store, no-cache, max-age=0, must-revalidate, proxy-revalidate
      
    • 托管缓存
      • 托管缓存由服务开发人员明确部署,以降低源服务器负载并有效地交付内容。示例包括反向代理、CDN 和 service worker 与缓存 API 的组合。
      • 托管缓存的特性因部署的产品而异。在大多数情况下,你可以通过 Cache-Control 标头和你自己的配置文件或仪表板来控制缓存的行为。
      • 也可以忽略标准 HTTP 缓存规范协议以支持显式操作。例如,可以指定以下内容以选择退出私有缓存或代理缓存,同时使用你自己的策略仅在托管缓存中进行缓存。
      Cache-Control: no-store
      
      • 这意味着如果托管缓存故意忽略 no-store 指令,则无需将其视为“不符合”标准。你应该做的是,避免使用 kitchen-sink 标头,但请仔细阅读你正在使用的任何托管缓存机制的文档,并确保你选择的方式可以正确的控制缓存。

# 启发式缓存

HTTP 旨在尽可能多地缓存,因此即使没有给出 Cache-Control,如果满足某些条件,响应也会被存储和重用。这称为启发式缓存。

# 基于 age 的缓存策略

存储的 HTTP 响应有两种状态:

  • fresh:状态通常表示响应仍然有效,可以重复使用
  • stale:状态表示缓存的响应已经过期

确定响应何时是 fresh 的和何时是 stale 的标准是 age。在 HTTP 中,age 是自响应生成以来经过的时间。

支付宝打赏
支付宝打赏
微信打赏
微信打赏