web缓存

292 阅读2分钟

缓存类型(宏观)

  1. 共享缓存(能被各级代理缓存的缓存)
  2. 私有缓存(用户专享的缓存,不能被各级代理缓存)

缓存类型(微观)

  1. 浏览器缓存
  2. CDN缓存
  3. 代理服务器缓存
  4. 数据库缓存
  5. 应用层缓存

缓存规则

所谓缓存就是把获取的资源存起来,等下一次再需要该资源的时候,就从存储的地方拿到该资源,节省时间

缓存的规则由请求的响应头决定

强缓存

浏览器端的资源 css文件一般会存储到硬盘中每次读取的时候(from disk cache),js和图片等文件解析后会存储到内存中,每次读取的时候(from memory cache)

相关的headers

Expires(1.0)

Expires的值是一个GMT格式的时间字符串,比如:Expires:Thu,21 Jan 2018 23:39:02 GMT 如果在这个时间节点内,则命中强缓存

Cache-Control(1.1 优先级更高)

在HTTP/1.1中,Cache-Control是最重要的规则,常见的有6个属性值

  1. public - 所有的内容都会被任何中间节点缓存(浏览器和代理服务器)
  2. private(默认值) - 所内容只有浏览器可以缓存
  3. no-cache - 使用协商缓存,即当前cache-control规则不再生效,而是使用Etag或Last-Modified字段控制缓存
  4. no-store - 不缓存,不用强制缓存也不用协商缓存
  5. max-age - 其值为一个时间段,超出该时间段后,缓存内容将失效
  6. s-maxage(单位s) - 同max-age, 只用于共享缓存,优先级高于 max-age 和 Expires Header

协商缓存

协商缓存生效,返回304和Not Modified

协商缓存失效,返回200和请求结果

  1. last-Modified和If-Modified-Since

第一次响应的时候,会携带last-Modified,该字段记录的是资源最后的修改时间,之后的请求会传递请求头 If-Modified-Since,其值为第一次响应时 last-Modified的值,服务器会根据这个值与资源的最新修改时间进行比较,如果一致则命中缓存,否则就返回新的资源

  1. ETag和If-None-Match

第一响应的时候,会携带ETag,该字段记录的是资源的唯一标识(根据资源计算的hash值,只要资源有变动就会更新hash值),之后的请求会传递请求头If-None-Match,其值为第一次响应时ETag的值,服务器会根据这个值与资源的最新唯一标识进行比较,如果相同则命中缓存,否则就返回新的资源。