浏览器缓存机制

130 阅读4分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

一、什么是浏览器缓存

二、缓存位置

三、强缓存

四、协商缓存

五、浏览器缓存机制

优点:

  • 降低服务器压力,节约带宽

  • 减少延迟,访问速度更快

缺点:

实时性要求高的数据不适合用缓存

什么是浏览器缓存

Web缓存存在于服务器和客户端之间。Web缓存密切注视着服务器-客户端之间的通信,监控请求,并且把请求输出的内容(例如html页面、 图片和文件等静态资源)存储到本地,根据缓存规则是否使用缓存资源或者重新请求服务器资源

浏览器缓存(缓存方式)

image.png

浏览器缓存(Cache-Control)

1、max-age:资源被访问后的存活最大时间、 N(S)后失效、 计算方式 max-age = expires- date:

2、s-maxage: 只用于共享缓存,比如CDN缓存。与max-age 的区别是:max-age用于普通缓存,

而s-maxage用于代理缓存。如果存在s-maxage,则会覆盖max-age 和 Expires.

3、Expires:http1.0特性,文档过期的时间 例如Expires: Wed, 26 Jun 2019 05:10:38 GMT

5、no-cache:从字面意义上很容易误解为不缓存,但是no-cache代表不缓存过期的资源,缓存会向服务器进行有效

处理确认之后处理资源,更确切的说no-cache的目的就是为了防止从缓存中获取过期的资源。

5、no-store:no-store 彻底得禁用缓冲,本地和代理服务器都不缓冲,每次都从服务器获取

6、public:表示它既可以存在共享缓存,也可以被存在本地缓存。

7、private:表示它只应该存在本地缓存。

8、must-revalidate:必须与服务器进行验证才能访问缓存资源,先经过验证返回304,再访问缓存,如果

max-age,未过期要等过期后must-revalidate才能生效must-revalidate 遇到服务器故障无法使用,no-cache可以

继续使用本地缓存must-revalidate用在对事务要求比较严苛的情况下使用(比如支付)

9、max-stale:客户机可以接收超出max-age时间的响应消息,max-stale在请求设置中有效,在响应设置中无效

max-age和max-stale在请求中同时使用的情况下,缓存的时间可以为max-age和max-stale

浏览器缓存(缓存过程分析)

image.png

①内存缓存(from memory cache):内存缓存具有两个特点,分别是快速读取和时效性:

1、快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中。

2、时效性:一旦该进程关闭,则该进程的内存则会清空。

浏览器缓存位置(举例)

②硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放

的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。

浏览器缓存位置(浏览器读取缓存的顺序)

1、先去内存看,如果有,直接加载

2、如果内存没有,择取硬盘获取,如果有直接加载

3、如果硬盘也没有,那么就进行网络请求

强制缓存

强制缓存就是向浏览器缓存查找该请求结果,并根据该结果的缓存规则来决定是否使用该缓存结果

的过程,强制缓存的情况主要有三种(暂不分析协商缓存过程)

1、没有缓存结果和缓存标识,

2、有缓存结果和缓存标识,且该结果尚未失效,

3、存在缓存结果和缓存标识,但该结果已失效

Cache-Control & Expires(强缓存缓存规则)

image.png

协商缓存规则

协商缓存的标识也是在响应报文的HTTP头中和请求结果一起返回给浏览器的,控制协商缓存的字段

分别有:

1、Last-Modified / If-Modified-Since

2、Etag / If-None-Match,

注:Etag 优先级高于Last-Modified,

同时存在则只有Etag / If-None-Match生效。

  • If-Modified-Since 把第一次请求 Last-Modified的值,作为下一次请求的值提交给服务器进行校验是否 过期,如果过期重新请求资源,返回200,并返回结果和缓存标示给客户端,否则返回304,直接读取本地资源 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT

  • If-None-Match 把第一次请求 Etag的md5值,作为下一次请求的值提交给服务器进行校验内容是否修改过,如果修改过重新请求资源,返回200,并且把结果返回客户端,否则返回304,直接读取本地资源If-None-Match: “737060cd8c284d8af7ad3082f209582d”