彻底搞懂浏览器缓存

115 阅读3分钟

缓存位置

浏览器查找缓存的顺序Service Worker->Memory Cache->Disk Cache->Push Cache

  • Service Worker:运行在浏览器背后的独立线程,它可以自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的
  • Memory Cache:基于内存的缓存,读取高效速度快,但是一旦关闭网页,内存就释放了。
  • Disk Cache:基于磁盘的缓存,容量大,读取慢
  • Push Cache:推送缓存,http2中的内容,缓存在会话session中的

强缓存

Expires

http1.0使用的缓存策略,值是服务端返回的到期时间(格林威治时间),再次请求未超出这个时间直接使用缓存数据,否则再次请求数据 缺点是使用本地时间容易被篡改

pragma

这个是HTTP1.0中禁用网页缓存的字段,其取值为no-cache,和Cache-Control的no-cache效果一样 优先级高于Cache-Control:no-cache

Cache-Control (优先级高于Expires)

http1.1引入

主要值

  • public 服务端和客户端都可以缓存资源
  • private 只有客户端可以缓存资源
  • no-cache 客户端缓存资源 需要验证协商缓存
  • no-store 不缓存
  • max-age 缓存保质期 单位s (相对日期 Expires绝对日期)

协商缓存

协商缓存就是强缓存失效,浏览器会向服务端发送携带缓存标识的请求,由服务端根据缓存标识判断是否使用缓存,命中就返回304否则返回200和请求结果

last-modified/if-modified (http1.0)

  1. 上一次请求服务端会返回一个last-modified响应头字段,表示缓存到期时间(本地绝对时间)
  2. 再次请求会携带一个if-modified-since的请求头字段,值就是上一次响应的last-modified的值
  3. 服务端将if-modified-since的值和该资源在服务器的最后修改时间做对比,来判断返回最新资源还是返回304使用缓存
  • 缺点:编辑资源后并没有修改内容 但是资源最后修改时间已经被修改了就不会命中协商缓存 所以依然会返回新资源造成性能浪费

etag/if-none-match (http1.1)

  1. 服务器响应时会返回一个etag字段,表示请求的资源在服务器上的唯一标识(由服务器生成)
  2. 再次请求时会携带一个if-none-match的请求头字段 值就是上一次返回的etag
  3. 服务器将if-none-match的值和该资源在服务器的etag的值做对比,一致返回304否则返回200
  • 通过这种方式 及时资源被修改但只要内容没有更新 依旧会命中协商缓存

Etag / If-None-Match优先级高于Last-Modified / If-Modified-Since,同时存在则只有Etag / If-None-Match生效。

页面刷新对缓存的影响

  • ctrl+F5 直接跳过前缓存和协商缓存 请求最新资源
  • F5 跳过强缓存 检查协商缓存
  • 地址栏输入url回车 直接使用缓存

浏览器缓存总结

请求时会判断是否命中强缓存 也就是catch-Control和expires 没有命中再判断是否命中协商缓存 etag/if-match/since last-modified/if-modified-since 命中返回304使用缓存 否则获取最新资源并更新浏览器缓存缓存 image.png