Http缓存 --- 强缓存和协商缓存(详解)

摘要

关于缓存,在性能优化上有着很重要的意义,或者说缓存的存在是就是为了提升性能。
而缓存也分为强缓存和协商缓存,而这一篇文章。
我们在最后介绍二者的区别,前面主要来说一下缓存的过程,加深理解。

1.为什么要有缓存?

我们设想一下,如果没有缓存,那么浏览器是怎么向服务端请求资源的。
不管服务端的资源是否更新,只要我们刷新页面,就一定会向服务器发送请求。
但是这次请求的资源和上次的资源并没有什么区别,这就造成了资源的浪费。

所以我们引入了缓存的概念,在第一次向服务器请求资源的时候,把资源保存在本地的磁盘,下次我直接从磁盘里面拿资源,这样就不用重复请求了。

但这里面有一个很严重的问题,如果服务器的资源更新了,浏览器是捕捉不到的,也就是本地的资源是无法更新的。

在这里插入图片描述

2.Expires

为了解决上面的情况,这里面缓存提供了一种方法,就是说我们第一次请求的时候,服务器会给浏览器返回一个字段:Expires

这个字段代表的意思是资源的过期时间,也就是说在这个时间内,浏览器你不要给我服务器发送请求,等这个时间过了,你再给我发送请求,我给你资源。

在这里插入图片描述
但是这里就又有两个问题了,我们先说第一个,这里的Expires是绝对时间,也就是本地的时间,可是本地的时间是可以人为的修改。

这里的解决办法是,Cache-Control这个字段的max-age是绝对时间,所以在第一次请求的时候可以通过设置max-age这个值来解决这个问题。同时这个字段的优先级是高于Expires的,所以不用担心二者共存的问题。

第二个问题就是,如果Expires这个时间过了之后,服务器的资源还是没有更新,所以这个请求还是多余的请求。

3.Last-Modified

所以为了解决上面的问题,缓存方面又加入了一个字段Last-Modified,这个字段的意思是资源的最近更新时间

什么意思呢,就是我在第一次请求之后,服务器不仅返回了Expires过期时间,还返回了一个Last-Modified资源最近更新时间。
当Expires的时间结束后,浏览器向服务器发送请求,并且把这个最近更新的时间传给服务器
这个时候服务器就要比较当前的Last-Modified和浏览器传过来的一不一致了

如果一致,就说明服务器这边的资源并没有更新,它会告诉浏览器你直接从内存里拿就可以。
如果不一致,就说明服务器这边的资源已经更新了,并且会把最新的资源返回给浏览器。

在这里插入图片描述
但其实这里面还有一个问题,就是Last-Modified这个时间的最小单位是s,也就是说如果,当然是如果,服务器的资源在1s内裤裤一直改,这个字段就捕获不到了。
所以我们需要一个缩小精度的方法

4.E-tag

E-tag这个字段,可以说是服务器这边资源改变的唯一标识,也就是说只要资源一变,这个字段的值也会更改。

所以在第一次请求的时候,服务器可以把这个字段返回回来,等Expires时间过了之后(或者是max-age时间过了之后)。浏览器再次向服务器发送请求。

这个时候服务器会比较E-tag的值是否一致,情况和Last-Modified也是一样的。
但是这里面E-tag的优先级要高于Last-Modified,所以也不用担心二者共存的情况。

5.强缓存和协商缓存

最后我们在说一下强缓存和协商缓存。
二者的区别主要也就是都是从缓存里面拿资源,不一样的就是强缓存不会向浏览器发送请求,协商缓存需要像浏览器发送请求。

如果对上面的内容看完了,应该很容易理解这句话了吧,在上面的内容里:

只有在Expires时间内和max-age的时间内,浏览器才不会向服务器发送请求,直接从内存里面拿数据,这就是强缓存

Expires时间内和max-age的时间后,Last-Modified或者E-tag一致的情况下,是发送了请求并且从缓存里拿数据,这就是协商缓存

猜你喜欢

转载自blog.csdn.net/weixin_46726346/article/details/120848475
今日推荐