HTTP缓存机制

2019-12-09  本文已影响0人  金桔柠檬加冰

HTTP缓存机制

前言

​ 缓存机制无处不在,有客户端缓存,服务端缓存,代理服务器缓存等。在HTTP中具有缓存功能的是浏览器缓存。HTTP缓存作为web性能优化的重要手段

​ HTTP缓存整理:

缓存规则

​ 浏览器存在一个缓存数据库,用于存储一些不经常变化的静态文件(图片、css、js等)。缓存分为强制缓存和协商缓存。

强制缓存

​ 当缓存数据库中已有所请求的数据时,客户端直接从缓存数据库获取数据。当缓存数据库中没有所请求的数据时,客户端从服务端获取数据

[图片上传失败...(image-6914ca-1575861223079)]

协商缓存

​ 又称为对比缓存,客户端会先从缓存数据库中获取到一个缓存数据的标识,得到标识后请求服务端验证是否失效(新鲜),如果没有失效服务端返回304,此时客户端直接从缓存中获取所请求的数据,如果标识失效,服务端会返回更新后的数据

[图片上传失败...(image-837004-1575861223079)]

注意:

​ 两种缓存机制可以同时存在,强制缓存的优先级高于协商缓存,当执行强制缓存时,如若缓存命中,则直接使用缓存数据库数据,不在进行缓存协商

缓存的方案

​ 服务器如何判断缓存是否失效?在浏览器和服务器进行交互的时候会发送一些请求数据和响应数据,称之为HTTP报文。报文中包含首部header和主体部分body。与缓存相关的规则就包含在header中。body中的内容是HTTP请求正在要传输的部分

[图片上传失败...(image-46dd-1575861223080)]

对HTTP报文中出现的与缓存规则相关的信息做详细解释

强制缓存

​ 对于强制缓存,服务器响应的header中会用两个字段来表明——Expires和Cache-Control

Expires

​ Expires的值为服务端返回的数据到期时间。当再次请求时的请求时间小于返回的此时间,则直接使用缓存数据。但由于服务端时间和客户端时间可能有误差,这也将导致缓存命中的误差,另一方面,Expire是HTTP1.0的产物,故现在大多数使用Cache-Control代替

Cache-Control

​ Cache-Control有很多属性,不同的属性代表的意义也不同。

协商缓存

​ 协商缓存需要进行对比判断是否可以使用缓存。浏览器第一次请求数据时,服务器会将缓存标识与数据一起响应给客户端,客户端将它们备份至缓存中。再次请求时,客户端会将缓存中的标识发送给服务器,服务器根据此标识判断。若未失效,返回304状态码,浏览器拿到此状态码就可以直接使用缓存数据。

Last-Modified

Last-Modified:服务器在响应请求时,会告诉浏览器资源的最后修改时间

if-Modified-Since:浏览器再次请求服务器的时候,请求头会包含此字段,后面跟着在缓存中获得的最后修改时间。服务端收到此请求头发现有if-Modified-Since,则与被请求资源的最后修改时间进行对比,如果一致则返回304和响应报文头,浏览器只需要从缓存中获取信息即可。字面上就是说:从某个时间节点算起,是否文件被修改了

if-Unmodified-Since:从某个时间点算起,是否文件没有被修改

这两个的区别是一个是修改了才下载一个是没修改才下载。Last-Modified说好却也不是特别好,因为如果在服务器上,一个资源被修改了,但其实际内容根本没有发生变化,会因为Last-Modified时间匹配不上而返回了整个实体给客户端(即使客户端缓存里有个一模一样的资源),为此推出了Etag

Etag

Etag:服务器响应请求时,通过此字段告诉浏览器当前资源在服务器生成的唯一标识(生成规则由服务器决定)

If-None-Match:再次请求服务器时,浏览器的请求报文头部会包含此字段,后面的值为在缓存中获取的标识。服务器接收到次报文后发现If-None-Match则与被请求资源的唯一标识进行对比

实际应用中由于Etag的计算是使用算法得出的,而算法会占用服务端计算的资源,所有服务端的资源都是宝贵的,所以很少使用Etag

缓存的优点

不同刷新的请求执行过程

上一篇下一篇

猜你喜欢

热点阅读