浏览器的缓存策略|青训营

96 阅读4分钟

1.缓存流程

浏览器初次请求时没有缓存,服务器响应结果后会给返回的数据带上一些标识,比如过期时间,是否缓存等,然后浏览器再次请求的时候就会利用这些信息判断,如果是没有过期,就直接从缓存拿,也就是强缓存;如果过期了,那就到通过请求到服务器进行比较,无变动就告诉浏览器还是从缓存拿,有变动就返回新结果,这样就是协商缓存。放一个大佬画的流程图方便理解。

img

2.强缓存

强缓存是指当资源的有效期未过期时,直接从缓存中获取资源,而不发送请求到服务器。常见的强缓存策略有Expires和Cache-Control。下图是掘金插件首页的数据文件加载,可以看出完全禁止了缓存。

image-20230829154840268.png

2.1 Expires

Expires 是 HTTP/1.0 的一个响应头字段,它指定了资源的过期时间,即资源在客户端的缓存有效期。浏览器会在该时间之前直接从缓存中加载资源,不发起网络请求,结构为Expires:Fri, 31 Dec 2023 23:59:59 GMT

2.2 Cache-Control

Cache-Control 是 HTTP/1.1 的一个响应头字段,它提供了更精确的缓存控制机制。常用的指令包括 max-age、no-cache、no-store 等,比如Cache-Control: max-age=3600

3.协商缓存

协商缓存是指当资源的有效期过期时,发送一个请求到服务器进行比较验证,根据服务器端返回的验证结果决定是否使用缓存。下图是掘金插件首页的js文件加载。

image-20230829154626141.png

3.1 Last-Modified / If-Modified-Since

当服务器返回资源时,会携带一个 Last-Modified 响应头字段,表示资源最后修改的时间。当浏览器再次请求该资源时,会通过 If-Modified-Since 请求头字段将上次缓存的 Last-Modified 值发送给服务器。如果资源未发生修改,服务器返回 304 Not Modified,浏览器则直接从缓存加载资源。

3.2 ETag / If-None-Match

当浏览器发送 If-None-Match 请求头时,服务器会首先判断传递的 ETag 是否匹配当前资源的标识符。如果匹配,则返回 304 Not Modified 状态码,否则更新资源。基本上和Last-Modified差不多,但是还是有不少区别,首先ETag 是服务器为资源生成的唯一标识符,通常是根据资源的内容计算得出的散列值,其次 ETag 可以处理更细粒度的更新,如内容微小的变化或者文件重命名,还有ETag 的计算和比较可能会增加服务器的计算开销,所以一般是两者同时使用。

4.强缓存和协商缓存比较

强缓存适用于那些在一定时间内不会发生变化的资源,而协商缓存适用于那些可能会发生变化的资源,通过与服务器协商确定是否需要重新获取资源。强缓存能够减少网络请求,加快页面加载速度,但可能会导致客户端不能及时获取到最新的资源。协商缓存可以兼顾资源更新和加载性能,但相对于强缓存增加了一次往返的网络请求延迟。

5.其他缓存方案(CDN缓存)

CDN缓存是一种通过将数据存储在分布式的缓存服务器上,并提供就近访问的方式来加速网络内容传输的技术,从而能够减少数据传输的延迟和网络拥塞,缓存过程如下:

  1. 域名解析:当用户请求一个网站时,首先进行域名解析,将域名解析为对应的 IP 地址。
  2. 就近访问:CDN 提供商将数据副本存储在位于全球不同地理位置的缓存服务器上。根据用户的地理位置和请求路径,CDN 会将用户的请求定向到离用户更近的缓存节点,以便提供更快的响应速度。
  3. 缓存命中:当用户发送请求时,CDN 缓存节点会检查是否已经缓存了相应的资源文件。如果存在缓存且未过期,则直接返回缓存的资源给用户,避免了请求传递到源服务器的延迟。
  4. 缓存更新:如果用户请求的资源在缓存节点中不存在或已过期,CDN 缓存节点会向源服务器发起请求,获取最新的资源文件。同时,CDN 缓存节点会将这些资源缓存起来,以便后续请求的命中。
  5. 缓存失效:为了避免缓存中的资源过时,CDN 缓存节点会定期检查源服务器上的资源是否有更新。当源服务器上的资源文件发生变动时,CDN 缓存节点会请求最新的资源文件,并替换旧的缓存内容。