轻松搞懂HTTP缓存,这一篇文章就够了

2021-12-16  本文已影响0人  辉夜真是太可爱啦

大家好,我是辉夜真是太可爱啦 。故事的开始,要从一道经典的面试题开始说起, 从输入 URL 到页面加载完成,发生了什么? 相信大家应该对这个题目也很耳熟了。本系列是我 《一文搞懂JS系列》 之后的第二个系列。旨在让大家搞懂这个加载过程,从简答以及深入解答都能够对答如流

前言

大家好,我是辉夜真是太可爱啦

在浏览器向服务器发起请求此之前,其实还有一步先查看是否有缓存。

毕竟,网站上的有些资源其实早前可能已经获取过,既然本地直接有,为何还要大费周章地请求服务器再去拿一遍呢!

所以,缓存的存在,自然有它的一定优势:

先上思维导图:

image.png

那么,辉夜 就在想,我把网站上的所有东西,全部都缓存起来,那么,下次打开岂不是更快,顿时感觉自己是 性能优化大师

事情哪有那么顺利 ,结果可想而知,当资源有更改的时候,如果客户端不及时更新会造成用户获取信息滞后,用户依旧使用的是缓存中的老版本,而且如果老版本有bug的话,情况那就只会更加糟糕。

所以,彻底弄懂 HTTP 缓存,在工作中更合理地使用缓存,是十分重要的。

那么首先,HTTP缓存其实分为两类,那就是 强缓存协商缓存

强缓存

强缓存的强,是 强制 的意思。听名字也知道,强缓存 的优先级在 协商缓存 的前面。

它不需要发送请求到服务端,直接读取浏览器本地缓存,不得不说,确实挺 的。这下都直接把请求服务器的步骤都给去了,直接自给自足。

然后,在强缓存中,又分为两种:

image.png

强缓存主要由三个字段名来控制,Expires Cache-Control Pragma ,我们按照优先级从低到高依次介绍:

(存储在硬盘或者是内存,并不是由这三个字段名来控制的,浏览器在获取资源之后(无论是强缓存或者协商缓存或者网络重新获取中取得的资源),就会将资源存储到内存中,下一次再获取的时候,就可以从内存中获取到了,当浏览器关闭之后,内存中的资源清空)

Expires

Expires 指的是过期时间,它的值是 GMT时间 。在浏览器发起请求时,会根据系统时间和 Expires 的值进行比较,如果系统时间超过了 Expires 的值,那么就代表缓存失效了。

由于系统时间和服务器时间不一致的时候,就会存在校验不准确的情况,而且,系统时间是可以用户自行设定的。所以,它的优先级自然是最低的。

Cache-Control

顾名思义,缓存控制。它是一个对象,比较常用的属性值有:

Pragma

Pragma 只有一个属性值,就是 no-cache ,效果和 Cache-Control 中的 no-cache 一致,不使用强缓存,需要与服务器验证缓存是否新鲜,在 3 个头部属性中的优先级最高。

协商缓存

当设置了不走强缓存,或者是强缓存过期失效的时候,就会走协商缓存。

协商缓存,就是客户端和服务器之间互相协商的结果。

ETag 是服务器自动生成或者由开发者生成的对应资源在服务器端的 唯一hash标识符 ,例如 67690D623E0034098C6998E9233565A7

当服务端的文件变化的时候,它的 hash码会随之改变。其判断过程与 Last-Modified/If-Modified-Since 类似。

ETag 又有强弱校验之分,如果 hash 码是以 W/ 开头的一串字符串,例如 W/"5eb03d6a-36a9" ,说明此时协商缓存的校验是弱校验的,只有服务器上的文件差异(根据 ETag 计算方式来决定)达到能够触发 hash 值后缀变化的时候,才会真正地请求资源,否则返回 304 并加载浏览器缓存。

整体流程图

image.png

参考资料

图解 HTTP 缓存

http协商缓存VS强缓存

上一篇 下一篇

猜你喜欢

热点阅读