2023-03-02 11:12:31

什么是缓存

对请求过的文件进行存储,方便重复使用,降低服务器压力,提高访问速度

HTTP 缓存需要解决以下问题:

  1. 哪些资源需要加入到缓存中
  2. 缓存的周期是多久
  3. 资源更新后,如何更新缓存
  4. 缓存过期但服务器资源未变动时如何处理

缓存规则

强缓存

再次请求时无需向服务器发送请求。

相关的 Response Headers

  • Expires
      Expires: Mon, 25 Oct 2023 20:11:12 GMT
    
  • Cache-Control
    • no-cache:每次请求需要校验服务器资源的新鲜度
    • max-age=3153600:浏览器在一年内都不需要向服务器请求资源

协商缓存

再次请求时需要向服务器校验资源的新鲜度。如果资源是新鲜的,服务器返回 304 状态码,浏览器继续使用本地缓存。

相关的 Headers:

  • Last-Modified / If-Modified-Since
    • 响应头的 Last-Modified 和请求头的 If-Modified-Since 进行比对
  • ETag / If-None-Match
    • 响应头的 ETag 和请求头的 If-None-Match 进行比对

启发式缓存

当资源没有配置 Cache-ControlExpires 强缓存响应头时,客户端会根据以下两个响应头来计算合适的强缓存时间,这种策略被称为启发式缓存:

  • Date:资源在源服务器的产生时间
  • Last-Modified:服务器上资源修改的最后时间

例如,资源生成时间是 2021/02/22,最近一次修改时间是 2022/02/22,时间差为一年。客户端会采用 Last-Modified 值的 10% 作为缓存时间,即 0.1 年。

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
Last-Modified: Tue, 22 Feb 2021 22:22:22 GMT

<!doctype html>
...

Cache-Control

作为响应头

用来控制缓存策略。

作为请求头

  • Cache-Control: no-cache:表示即使客户端拥有未过期的缓存,也要向服务器请求获取最新的资源
  • Cache-Control: max-age=0:会验证服务器资源的新鲜度,如果缓存未过期则使用缓存并返回 304 状态码,否则重新获取资源并返回 200 状态码

Reference