【浏览器原理】Web缓存
浏览器缓存的好处
- 缓解服务器压力,对于某些不会实时更新的数据,不用每次都向服务器去请求了
- 提升网站性能,打开缓存在本地的资源肯定会比请求服务器来得快
- 减少带宽消耗,当我们使用缓存时,只会产生很小的网络消耗(协商缓存)
Web缓存的种类
-
数据库缓存
-
CDN缓存
-
Content Delivery Network 内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,
使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。 -
10年前,还没有火车票代售点一说,12306.cn更是无从说起。那时候火车票还只能在火车站的售票大厅购买,而我所在 的小县城并不通火车,火车票都要去市里的火车站购买,而从我家到县城再到市里,来回就是4个小时车程,简直就是浪费 生命,后来就好了,小县城里出现了火车票代售点,甚至乡镇上也有了代售点,可以直接在代售点购买火车票,方便了不 少,全市人民再也不用在一个点苦逼的排队买票了。 CDN就像是每一个代售点(缓存服务器)的承包商。用户在浏览器网站的时候,CDN会选择一个离用户最近的CDN边缘节点 来响应用户的请求,同时这样的做法也起到了分流的作用,减轻了服务器的负载压力。(引用自某掘金博主) -
CDN缓存机制
-
- 在浏览器本地缓存失效后,浏览器会向CDN边缘节点发送请求。类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。CDN边缘节点缓存策略因服务器不同而不同,但一般都会遵循http标准协议,通过http响应头中的 `cache-control: max-age` 的字段来设置CDN边缘节点数据缓存时间。
- 当浏览器向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN节点就会向服务器发出回源请求,从服务器拉取最新数据,更新本地缓存,并将最新数据返回给客户端。 CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。
-
代理服务器缓存
-
浏览器缓存
浏览器缓存存放的位置
Service Worker-->Memory Cache-->Disk Cache-->Push Cache
存存储图像和网页等资源主要缓存在disk cache,操作系统缓存文件等资源大部分都会缓存在memory cache中
-
Service Worker
- 是运行在浏览器背后的独立线程,一般可以用来实现缓存功能。使用 Service Worker的话,传输协议必须为 HTTPS。因为 Service Worker 中涉及到请求拦截,所以必须使用 HTTPS 协议来保障安全。Service Worker 的缓存与浏览器其他内建的缓存机制不同,它可以让我们自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的。
-
Memory Cache
- 内存中的缓存,主要包含的是当前中页面中已经抓取到的资源,例如页面上已经下载的样式、脚本、图片等。读取内存中的数据肯定比磁盘快,内存缓存虽然读取高效,可是缓存持续性很短,会随着进程的释放而释放。一旦我们关闭 Tab 页面,内存中的缓存也就被释放了。
-
Disk Cache
- 存储中硬盘中的缓存,读取速度较慢,但容量大时效性强。
-
Push Cache
- Push Cache(推送缓存)是 HTTP/2 中的内容,当以上三种缓存都没有命中时,它才会被使用。它只在会话(Session)中存在,一旦会话结束就被释放,并且缓存时间也很短暂,在Chrome浏览器中只有5分钟左右,同时它也并非严格执行HTTP头中的缓存指令
强缓存和协商缓存
强缓存:当我们访问URL时,不会向服务器发送请求,而是直接从缓存中读取资源,但即使不向服务器发送请求,也还是会返回200点状态码
-
设置强缓存
- 当我们进行第一次请求时,服务器会给出应答,浏览器则会根据浏览器应答的内容中的
response Header(响应头)来判断是否对资源进行缓存,如果响应头中有expires/cache-control/pragma字段,代表这首强缓存,浏览器就会吧资源缓存到memory cache/disk cache中。 - 第二次请求时,浏览器判断请求参数,如果命中强缓存条件并且资源未过期就直接返回状态码200并从本地中拿数据。如果没命中强缓存,则携带缓存标识向服务器发起请求,服务器根据缓存标识看是否命中协商缓存,符合则返回304,不符合则服务器返回全新资源
- 当我们进行第一次请求时,服务器会给出应答,浏览器则会根据浏览器应答的内容中的
-
字段
-
expires:是HTTP1.0控制网页缓存的字段,值为一个时间戳,准确来讲是格林尼治时间,服务器返回该请求结果缓存的到期时间,意思是,再次发送请求时,如果未超过过期时间,直接使用该缓存,如果过期了则重新请求。有个缺点,就是它判断是否过期是用本地时间来判断的,本地时间是可以自己修改的。
-
cache-control:是HTTP1.1中控制网页缓存的字段,当Cache-Control和expires都存在时,Cache-Control优先级更高。
- public:资源客户端和服务器都可以缓存。
- privite:资源只有客户端可以缓存。
- no-cache:客户端缓存资源,但是是否缓存需要经过协商缓存来验证。
- no-store:不使用缓存。
- max-age:缓存保质期。解决了expires的本地时间问题
-
协商缓存:协商缓存就是强缓存失效后,浏览器携带缓存标识向服务器发送请求,由服务器根据缓存标识来决定是否使用缓存的过程。
-
两种情况,生效和不生效
- 生效,返回304!
- 不生效,返回200和响应结果
-
设置协商缓存
-
Last-Modified / If-Modified-Since
- Last-Modified是服务器响应请求时,返回该资源文件在服务器最后被修改的时间。
- If-Modified-Since则是客户端再次发起该请求时,携带上次请求返回的Last-Modified值,通过此字段值告诉服务器该资源上次请求返回的最后被修改时间。如果服务器的资源最后被修改的时间大于If-Modified-Since的字段值,则重新返回资源,状态码200;否则返回304,代表资源无更新,可继续使用缓存文件
-
Etag / If-None-Match
- Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成)。
- If-None-Match是客户端再次发起该请求时,携带上次请求返回的唯一标识Etag值,通过此字段值告诉服务器该资源上次请求返回的唯一标识值。服务器收到该请求后,发现该请求头中含有If-None-Match,则会根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件;不一致则重新返回资源文件,状态码为200
-
强缓存和协商缓存的区别
- 强缓存不发请求到服务器,所以有时候资源更新了浏览器还不知道,但是协商缓存会发请求到服务器,所以资源是否更新,服务器肯定知道。
- 大部分web服务器都默认开启协商缓存。
刷新浏览器对于强缓存和协商缓存的影响
- 当ctrl+f5强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存。
- 当f5刷新网页时,跳过强缓存,但是会检查协商缓存。
- 浏览器地址栏中写入URL,回车 浏览器发现缓存中有这个文件了,不用继续请求了,直接去缓存拿。(最快)