Web 缓存介绍
Web 缓存是指一个 Web 资源(如 html 页面,图片,js,数据等)存在于 Web 服务器和客户端(浏览器)之间的副本。
缓存的优点
- 减少网络延迟,加快页面打开速度
- 减少网络带宽消耗
- 降低服务器压力
- ...
HTTP 缓存分类
浏览器缓存一般分为两类:1. 强缓存,也称本地缓存;2. 弱缓存,也就是协商缓存
本地缓存
浏览器在发送资源请求之前,会先去本地缓存查找是否存在此资源,如果能找到则直接从缓存中读取此资源信息,不会向服务器发送请求;如果找不到则向服务器发送请求。
协商缓存
当强缓存没有命中时,这时候浏览器会向服务器发起请求。服务器会根据请求头中的一些字段来判断是否命中协商缓存。如果命中,服务器会返回 304 响应,但是不会携带任何响应实体,只是告诉浏览器可以直接从浏览器缓存中获取这个资源。如果本地缓存和协商缓存都没有命中,则从直接从服务器加载资源。
强缓存主要是由服务器的响应头里 cache-control 和 expires 两个字段决定,协商缓存由 last-modified 和 etag两个字段决定。
强缓存的cache-control 和 expires
-
expires http1.0时定义的字段,表示过期时间,格式如 expires: Mon, 29 Mar 2021 01:03:05 GMT ,表示在这个时间之前,如果客户端需要再次获取这个资源,不会向服务器中取,会直接在缓存里读取。
-
cache-control http1.1时的字段,表示缓存的时间长度,格式如 cache-control: max-age=2592000,单位为秒,表示可缓存的时间是30天。
cache-control 还有以下设置:
- no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
- no-store:直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
- public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
- private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
Cache-Control与Expires可以在服务端配置同时启用,同时启用的时候Cache-Control优先级高。
- 优先级:cache-control 的优先级要高于 expires
协商缓存的last-modified 与 if-modified-since、etag 与 if-none-match
协商缓存就是由服务器来确定缓存资源是否可用,所以客户端与服务器端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问。
-
last-modified 与 if-modified-since
last-modified 表示该文件上一次被修改的时间,格式如 last-modified: Tue, 04 Aug 2020 14:54:28 GMT,当客户端第一次向服务器第一次请求时,服务器会在响应头上带上最后修改时间 last-modified,等到第二次客户端向服务器请求同样的资源时,客户端会在请求头上的 if-modified-since带上上一次请求的 last-modifed值,服务器对最后修改时间进行比较,如果时间一致,服务器返回304状态码,客户端直接在缓存中读取数据,如果不一致,服务器返回200的状态码,并更新文件 -
etag 与 if-none-match
etag表示文件的唯一标识,格式如 etag: "5f2976a4-17d",当客户端第一次向服务器第一次请求时,服务器会在响应头上带上文件唯一标识etag,等到第二次客户端向服务器请求同样的资源时,客户端会在请求头上的 if-none-match带上上一次请求的etag值,服务器对etag进行比较,如果时间一致,服务器返回304状态码,客户端直接在缓存中读取数据,如果不一致,服务器返回200的状态码,并更新文件 -
两者有什么区别呢?
etag的出现时为了解决last-modified所存在的一些问题
① 当周期性的更改文件的时间,但是并没有更改文件的内容时,
② last-modifed只能精确到秒,如果一个文件在1秒内更改了多次,那么无法更新到最新的数据,而etag的精确度更高
③ 某些服务器不能精确的得到文件的最后修改时间 -
两者如何使用
last-modified与etag是可以一起使用的,服务器会优先验证etag,一致的情况下,才会继续比对last-modified,最后才决定是否返回304