Http缓存

什么是缓存

通过复用以前获取的资源,可以显著提高网站和应用程序的性能。Web 缓存减少了等待时间和网络流量,因此减少了显示资源表示形式所需的时间。通过使用 HTTP缓存,变得更加响应性。

强制缓存

浏览器 <=== 本地缓存 ===> 服务器

Cache-Control:服务端控制

  • response headers 中
  • 控制强制缓存的逻辑
  • 例如 Cache-Control:max-age=3153600(单位是秒–一年)
  • max-age 控制缓存的有效日期
  • no-cache 不用强制缓存,不管服务端处理
  • no-store 不用本地缓存,也不用服务端缓存
  • private 该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。
  • public 该响应可以被任何中间人(译者注:比如中间代理、CDN等)缓存。

Expires

  • 同在 response headers 中
  • 同为控制缓存过期
  • 已被 Cache-Control 代替

协商缓存(对比缓存)

  • 服务端缓存策略,服务端判断该资源能不能被缓存。
  • 服务端判断客户端资源,是否和服务端一致
  • 一致则返回304,否返回200和最新的资源

资源标识

  • 在 response headers 中
  • Last-Modified 资源最后修改的时间
    • 初次请求,服务端返回资源和 Last-Modified
    • 再次请求的时候,request headers 带着 If-Modified-Since(与 Las-Modified 相同)
    • 返回304,或者返回资源和新的 Last-Modified
  • Etag 资源的唯一标识(一个字符串,类似人类的指纹 )
    • 同上,只是 换成了 Etag,对应的请求头应该为 If-None-Match
  • 会优先使用 Etag
  • Last-Modified 只能精确到秒级
  • 如果资源被重新生成,而内容不变,则Etag更精确

缓存总结图

/posts/index.zh/http%E7%BC%93%E5%AD%98.png

页面刷新操作

  • 正常操作:强制缓存有效,协商缓存有效
  • 手动刷新:强制缓存失效,协商缓存失效
  • 强制刷新:强制缓存失效,协商缓存失效