浏览器(1)——缓存梳理

289 阅读3分钟

前言

最近在看极客时间上的课程【浏览器的实现原理与实践】,其中有篇文章是为什么很多站点第二次打开比第一次要快,起原因在于

在真正发起网络请求之前,浏览器会先在浏览器缓存中查询是否有要请求的文件。其中,浏览器缓存是一种在本地保存资源副本,以供下次请求时直接使用的技术。

由此想到浏览器缓存这块,基于此做以下学习记录。

http缓存定义

客户端向服务器请求数据时,会先抵达浏览器缓存,如果浏览器有这个需要请求的资源的副本,就可以直接从浏览器的缓存中提取这个资源,而不用花费更多时间再从对应的服务器获取数据。

缓存分类

根据是否需要再次向服务器发起请求来判断分类,分为强缓存协商缓存

  1. 强缓存

  • 强缓存生效时,不会向服务器发送请求,直接从缓存中读取资源;

  • 返回的http请求状态码是200;

  • 强缓存相关的HTTP Header头类型是通过Expires和Cache-Control来控制的。

    • Expires: Expries字段是http1.0时的规范;它的值为一个绝对时间的GMT格式的时间字符串,如Mon, 10 Jun 2015 21:31:12 GMT,如果发送请求的时间在expires之前,那么本地缓存始终有效,否则就会发送请求到服务器来获取资源。
    • Cache-Control:有两个重要的取值,一个是no-cache即不使用本地缓存。另一个是max-age即利用max-age值来进行判断,它是一个相对值;资源第一次的请求时间和Cache-Control设定的有效期,计算出一个资源过期时间,再拿这个过期时间跟当前的请求时间比较,如果请求时间在过期时间之前,就能命中缓存,否则就不行。
  1. 协商缓存

  • 浏览器需要向服务器发送请求,请求会携带第一次请求返回的有关缓存的header字段信息(Last-Modified/If-Modified-Since和Etag/If-None-Match),由服务器根据请求中的相关header信息来比对结果是否协商缓存命中;若命中,则服务器返回新的响应header信息更新缓存中的对应header信息,但是并不返回资源内容,它会告知浏览器可以直接从缓存获取;否则返回最新的资源内容;

  • 如果服务器端的资源没有更新修改,那么服务器返回新的响应header信息更新缓存中对应的header信息,并且返回的 http 状态码为 304,服务器不返回资源内容,只会告知浏览器可以直接使用缓存数据;

  • 协商缓存的相关 header 头属性有:

    • Etag/If-None-Match:这两个值是由服务器生成的每个资源的唯一标识字符串,只要资源有变化就这个值就会改变;其判断过程与Last-Modified/If-Modified-Since类似,与Last-Modified不一样的是,当服务器返回304 Not Modified的响应时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag跟之前的没有变化。

使用缓存好处

  • 减少亢余的数据传输,节约资源
  • 缓解服务器压力,提高网站性能
  • 加快客户加载网页的速度

使用缓存注意的点

  • 尽量减少304请求,因为协商缓存每次都会与服务器交互,所以性能不是很好。

参考文章