# 简述 http 的缓存机制

Issue

欢迎在 Issue 中交流与讨论: Issue 80 (opens new window)

Http 缓存分为以下两种,两者都是通过 HTTP 响应头控制缓存

  1. 强制缓存
  2. 协商缓存

# 强制缓存

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

              client         server
GET /a.ab389z.js ------->
                      <------- 200 OK
(再也不会发请求)

与之相关的 Response Headers 有以下几个

  • Expires

    这个头部也是丧心病狂:使用绝对时间,且有固定的格式 https://tools.ietf.org/html/rfc822#section-5.1 (opens new window)

    Expires: Mon, 25 Oct 2021 20:11:12 GMT
    
  • Cache-Control,具有强大的缓存控制能力

    常用的有以下两个

    • no-cache,每次请求需要校验服务器资源的新鲜度
    • max-age=31536000,浏览器在一年内都不需要向服务器请求资源

# 协商缓存

再次请求时,需要向服务器校验新鲜度,如果资源是新鲜的,返回 304,从浏览器获取资源

           client         server
GET /a.js   ----------->
                   <----------- 200 OK
GET /a.js   ----------->
                   <----------- 304 Not Modified

与之相关的 Response Headers 有以下几个

  • Last-Modified/Modified-Since
  • Etag
Last Updated: 1/17/2021, 2:02:56 PM