浏览器缓存

什么是浏览器缓存

把已经请求过的资源拷贝一份副本存储在浏览器中,当下次请求相同的 URL 时,就会根据缓存机制,判断是否读取缓存还是再向服务器发出请求

img

浏览器缓存机制

核心:根据响应的 header内容 决定 是强缓存(本地缓存)还是 协商缓存

浏览器在请求某一资源时,会先获取该资源缓存的 header 信息根据 cache-control和expires信息,判断是否命中强缓存。如果命中,则直接在本地缓存中获取资源信息,包括缓存的 header 信息,这次请求不会与服务器进行通信

如果没有命中强缓存,浏览器会发送请求到服务器,请求会携带第一次请求返回的有关缓存的 header 信息(Last-Modified/If-Modified-Since 或 Etag/If-None-Match),由服务器比对结果是否命中协商缓存。如果命中,则服务器更新缓存中对应的 header信息,返回304 Not Modified,但并不返回资源内容;如果没有命中,则返回最新的资源内容

强缓存相关的header字段

  1. expires:一个绝对时间的 GMT格式 的时间字符串
  2. cache-control:max-age=number

利用该字段的 max-age 值来进行判断,它是一个相对值;资源第一次的请求时间和Cache-Control设定的有效期,计算出一个资源过期时间,再拿这个过期时间跟当前的请求时间比较,如果请求时间在过期时间之前,就能命中缓存,否则就不行

cache-control,优先级比 expires 大

两者一起使用时,Cache-Control/Expires 的优先级要高于 Last-Modified/ETag

协商缓存相关的header字段

这两组搭档都是成对出现的:第一次请求的响应头带上某个字段(Last-Modified或者Etag),则后续请求则会带上对应的请求字段If-Modified-Since或者If-None-Match);若响应头没有Last-Modified或者Etag字段,则请求头也不会有对应的字段。

一般情况下,使用 Cache-Control/Expires 会配合 **Last-Modified/ETag 一起使用,因为即使服务器设置缓存时间, **当用户点击“刷新”按钮时,浏览器会忽略缓存继续向服务器发送请求,这时Last-Modified/ETag将能够很好利用304,从而减少响应开销

  1. Last-Modified/If-Modified-Since

服务器再次收到资源请求时,根据浏览器传过来 If-Modified-Since资源在服务器上的最后修改时间判断资源是否有变化,如果没有变化则返回304 Not Modified,但是不会返回资源内容;如果有变化,就正常返回资源内容

当服务器返回304 Not Modified的响应时,响应 header 中不会再添加 Last-Modified 的header:因为既然资源没有变化,那么 Last-Modified 也就不会改变,这是服务器返回304时的 响应 header

如果协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified 的 Header 在重新加载的时候会被更新,下次请求时,If-Modified-Since会启用上次返回的Last-Modified值

  1. Etag/If-None-Match

这两个值是由服务器生成的每个资源的唯一标识字符串,只要资源有变化就这个值就会改变;其判断过程与Last-Modified/If-Modified-Since类似,与Last-Modified不一样的是,当服务器返回304 Not Modified的响应时,由于ETag重新生成过,响应 header 会更新 Etag

Last-Modified 与 ETag 区别

HTTP1.1中 Etag 的出现主要是为了解决几个 Last-Modified 比较难解决的问题:

  1. Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的新鲜度
  2. 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存
  3. 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形

Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

怎么知道资源已被修改,更新

核心:比对If-Modified-Since 或 If-None-Match 和资源在服务器上的最后修改时间

服务器返回资源的时候有时在控制头信息带上这个资源的实体标签Etag(Entity Tag),它可以用来作为浏览器再次请求过程的校验标识。如过发现校验标识不匹配,说明资源已经被修改或过期,浏览器需求重新获取资源内容

CDN缓存策略

主要作用:加速网络访问,本质仍然是一个缓存

在浏览器和服务器,加上一层CDN:

浏览器先检查是否有本地缓存、是否过期,如果过期,则向 CDN边缘节点 发起请求,CDN边缘节点 会检测用户请求数据的缓存是否过期,如果没有过期,则直接响应用户请求,此时一个完成http请求结束;如果数据已经过期,那么CDN还需要向源站发出回源请求,来拉取最新的数据

CDN网络是在用户和服务器之间增加缓存层,将用户的访问请求引导到最优的缓存节点而不是服务器源站点,从而加速访问速度。(负载均衡和缓存,距离一次http最起码三次握手四次挥手。7个来回的链接,距离的时延是指数增长的)