😼目的
本文章选择Google Chrome浏览器打开bilibili客户端,对于其涉及的请求中的缓存策略展开具体分析。
🐱缓存策略-强缓存
强缓存是利用http头中的Expires和Cache-Control两个字段来控制的,用来表示资源的缓存时间,Cache-Control 的优先级更高。
Cache-Control常用的值
- Max-age:客户端的本地资源应该缓存多少秒,开启了Cache -Control后有效
- no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
- no-store:直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
- public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
- private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器
Expires的值
- 它的值是一个绝对时间的GMT格式的时间字符串,代表这这个资源的失效时间。
- 如果资源仍然有效,浏览器从本地缓存加载。
从上可以看出这里资源缓存时间是一年,资源失效时间是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
由此图分析可知该网站也有协商缓存,所以是强缓存和协商缓存共同使用的缓存策略。
- 如果缓存失效,服务器再次给予一个正常的响应(响应码
200带响应体),同时可以附带上新的缓存指令,浏览器缓存新的内容 - 如果缓存有效,服务器返回304重定向,并且响应头带上新的缓存指令,浏览器作出相应缓存动作。
🐱总结
以下是该浏览器缓存策略分析:
- 当浏览器发出请求,产生缓存,通过若
max-age + Date的值是否大于的时间判断是否大于Expires时间,判断是否过期,未过期直接读取。 - 若过期,则
Etag在下一次请求时将该值作为If-None-Match请求头发送给服务器,或者Last-Modified浏览器在下一次请求时将该值作为If-Modified-Since请求头发送给服务器。 - 经过服务器决策后,缓存失效时返回响应码200,并附带新的缓存指令;缓存有效,返回响应码304重定向,从缓存读取,最终呈现。