🐟浏览器缓存策略分析|青训营

108 阅读3分钟

😼目的

本文章选择Google Chrome浏览器打开bilibili客户端,对于其涉及的请求中的缓存策略展开具体分析。

🐱缓存策略-强缓存

强缓存是利用http头中的ExpiresCache-Control两个字段来控制的,用来表示资源的缓存时间,Cache-Control 的优先级更高。

Cache-Control常用的值
  • Max-age:客户端的本地资源应该缓存多少秒,开启了Cache -Control后有效
  • no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
  • no-store:直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
  • public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
  • private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器
Expires的值
  • 它的值是一个绝对时间的GMT格式的时间字符串,代表这这个资源的失效时间。
  • 如果资源仍然有效,浏览器从本地缓存加载。

2.1.png

从上可以看出这里资源缓存时间是一年,资源失效时间是2024-7-19,判断缓存是否有效就是通过把max-age + Date判断是否大于资源失效时间。

🐱缓存策略-协商缓存(弱缓存)

Etag

资源的特定版本的标识符, Etags类似于指纹,浏览器在下一次请求时将该值作为If-None-Match请求头发送给服务器。

Last-Modified

请求资源的最后修改时间,浏览器在下一次请求时将该值作为If-Modified-Since请求头发送给服务器。

发送两个信息兼容不同的服务器,部分服务器识别If-Modified-Since,部分服务器识别If-None-Match或者两者都识别, If-None-Match 的优先级一般高于 If-Modified-Since

2.2.png

由此图分析可知该网站也有协商缓存,所以是强缓存协商缓存共同使用的缓存策略。

  • 如果缓存失效,服务器再次给予一个正常的响应(响应码200 带响应体),同时可以附带上新的缓存指令,浏览器缓存新的内容
  • 如果缓存有效,服务器返回304重定向,并且响应头带上新的缓存指令,浏览器作出相应缓存动作。

🐱总结

以下是该浏览器缓存策略分析:

  1. 当浏览器发出请求,产生缓存,通过若max-age + Date 的值是否大于的时间判断是否大于Expires时间,判断是否过期,未过期直接读取。
  2. 若过期,则Etag在下一次请求时将该值作为If-None-Match请求头发送给服务器,或者Last-Modified浏览器在下一次请求时将该值作为If-Modified-Since请求头发送给服务器。
  3. 经过服务器决策后,缓存失效时返回响应码200,并附带新的缓存指令;缓存有效,返回响应码304重定向,从缓存读取,最终呈现。