HTTP - 缓存
HTTP 通常用于分布式信息系统,通过使用响应缓存可以提升性能。HTTP/1.1 协议包含了许多旨在使缓存正常工作的元素。
HTTP/1.1 中缓存的目标是在许多情况下消除发送请求的需要,并在许多其他情况下消除发送完整响应的需要。
HTTP/1.1 中的基本缓存机制是服务器指定过期时间和验证器的隐式缓存指令。我们使用 Cache-Control 头部来实现这一点。
Cache-Control 头部允许客户端或服务器在请求或响应中传输各种指令。这些指令通常会覆盖默认的缓存算法。缓存指令以逗号分隔的列表形式指定。例如:
Cache-control: no-cache
缓存请求指令
以下缓存请求指令可由客户端在其 HTTP 请求中使用:
| 缓存请求指令 | 描述 |
|---|---|
| no-cache | 缓存不得在未与源服务器成功重新验证的情况下使用该响应来满足后续请求。 |
| no-store | 缓存不应存储有关客户端请求或服务器响应的任何信息。 |
| max-age = seconds | 表示客户端愿意接受的响应年龄不超过指定秒数的时间。 |
| max-stale [ = seconds ] | 表示客户端愿意接受已超过其过期时间的响应。如果指定了秒数,则不得超过该时间。 |
| min-fresh = seconds | 表示客户端愿意接受的新鲜生命周期不小于其当前年龄加上指定秒数的响应。 |
| no-transform | 不转换实体主体。 |
| only-if-cached | 不检索新数据。只有当文档在缓存中时,缓存才能发送该文档,且不应联系源服务器查看是否存在较新副本。 |
缓存响应指令
服务器可以在其 HTTP 响应中使用以下缓存响应指令:
| 缓存响应指令 | 描述 |
|---|---|
| public | 表示该响应可以被任何 cache 缓存。 |
| private | 表示响应消息的全部或部分仅针对单个用户,共享 cache 不得缓存。 |
| no-cache | cache 不得在未与 origin server 成功重新验证的情况下使用该响应来满足后续请求。 |
| no-store | cache 不应存储有关客户端请求或服务器响应的任何内容。 |
| no-transform | 不转换 entity-body。 |
| must-revalidate | cache 在使用陈旧文档之前必须验证其状态,过期文档不得使用。 |
| proxy-revalidate | proxy-revalidate 指令与 must-revalidate 指令含义相同,但不适用于非共享的用户代理 cache。 |
| max-age = seconds | 表示客户端愿意接受的响应年龄不超过指定的秒数。 |
| s-maxage = seconds | 此指令指定的最大年龄会覆盖 max-age 指令或 Expires 标头指定的最大年龄。s-maxage 指令始终被 private cache 忽略。 |