5分钟看懂系列:HTTP缓存机制详解

2020-02-10  本文已影响0人  大富帅

什么是HTTP缓存

HTTP 缓存可以说是HTTP性能优化中简单高效的一种优化方式了,缓存是一种保存资源副本并在下次请求时直接使用该副本的技术,当 web 缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。
一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,节省网络流量,并且由于缓存文件可以重复利用,降低网络负荷,提高客户端响应。
所以,学会利用HTTP缓存是很有必要的
在此,我会向大家系统的介绍HTTP缓存机制,期望对各位正确的理解HTTP缓存有所帮助。

缓存策略

在阐述HTTP不同缓存策略之前,我们需要知道用户刷新/访问行为 的手段分成三类:

不同的刷新手段,会导致浏览器使用不同的缓存策略,我们下面会分析到

HTTP 缓存主要是通过请求和响应报文头中的对应 Header 信息,来控制缓存的策略。
响应头中相关字段为Expires、Cache-Control、Last-Modified、Etag。

HTTP缓存的类型很多,根据是否需要重新向服务器发起请求来分类包括两种:强制缓存对比缓存
假设浏览器有一个缓存数据库用于本地缓存,先看看浏览器请求资源的情况:

浏览器第一次请求资源

强制缓存:
在浏览器已经缓存数据的情况下,使用强制缓存去请求数据的流程是这样的:

强制缓存

强制缓存

从流程图可以看到,强制缓存,在缓存数据未失效的情况下,可以直接使用缓存数据,不需要再请求服务器,那么浏览器是如何判断缓存数据是否失效呢?
对于强制缓存来说,响应header中会有两个字段来标明失效规则(Expires/Cache-Control):

举个例子:
比如一个资源响应头是:

cache-control: public, max-age=31536000

那么这个资源会被缓存31536000秒(365天),在365天内再次请求这条数据,都会直接获取缓存数据库中的数据,直接使用。
那么我们试试再次访问资源,会有以下的响应:


image

可以看到HTTP状态码是200,Size这个字段显示:disk cache,说明HTTP响应报文大小是0,浏览器确实走了强制缓存,没有再跟浏览器交互。
我们上面说了,不同的访问/刷新手段,会使浏览器使用不同的缓存策略,要让浏览器走强制缓存对请求方式有一个要求: 在URI输入栏中输入然后回车/通过书签访问

对比缓存:

在浏览器已经缓存数据的情况下,使用对比缓存去请求数据的流程是这样的:


image

有同学可能会问,基于对比缓存的流程下,不管是否使用缓存,都需要向服务器发送请求,那么还用缓存干什么?
这个问题,我们现在来探讨一下。
对比缓存,顾名思义,需要进行比较判断是否可以使用缓存。
浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给浏览器,浏览器将二者备份至缓存数据库中。
当浏览器再次请求数据时,浏览器将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。
举个例子:
第一次访问:


image

第二次访问:


image

对比缓存,响应header中会有两个字段来标明规则

值得注意的是:Etag 的校验优先级高于 Last-Modified
看个例子:
第一次请求,服务器的响应头包含了

image

第二次请求,浏览器的请求头


image

总结

我们再看一下HTTP缓存的一个总概流程图:


image
上一篇 下一篇

猜你喜欢

热点阅读