搞懂http的缓存机制及其原理

对于web性能的优化,缓存是一个非常重要的手段,对于web开发人员来说怎么能不知道http的缓存呢,以前我只知道缓存的存在,什么时候会用缓存,但是到底怎么实现的没深入研究过,随着对http的不断深入理解,今天就来探讨一下

先介绍一下HTTP的报文吧,有助于下面的理解

HTTP报文相信大家都不陌生,客户端和服务端的通信就依靠他来传输数据,分为请求报文和响应报文
http报文主要分为两部分:
请求首部(头);请求主体(数据)
请求头部中主要包含请求信息,cookie ,cache…
请求主体就是真正要传输的数据包

相信大家也能理解,关于缓存的信息就是存在header中进行发送,下面就介绍一下缓存规则

首先做一下铺垫,之所以有缓存是说明之前已经访问过了,才会出现在缓存中,那么当我们第一次访问一个url的时候,缓存在应该不会存在,整理一下这一段话,看图
在这里插入图片描述
这里我们把缓存就叫做缓存数据库,更形象一点,当发送一个请求,先去缓存找,没有就直接像服务端请求数据,服务端就会返回数据以及缓存规则,客户端接收到,就存进缓存中,以供下次使用。

HTTP缓存有多种规则,根据是否需要重新向服务器发起请求来分类,我将其分为两大类(强制缓存,对比缓存)

强制缓存

通过这个字面上的意思大概就能知道他就是要强制使用缓存,不需要重新向服务器发送请求
在这里插入图片描述
这么说可能大家还是不太理解没觉得好像没什么毛病,那我们看一下对比缓存就知道了

对比缓存

在这里插入图片描述

对比缓存,找到缓存后,要像服务端发起请求来验证他的缓存是否还有效,有效就使用,无效的话,服务端直接返回新的数据,客户端更新数据保存在缓存数据库中

我相信大家应该一下子就能看出两者的差距,强制体现在哪里了!

下面我们在深入到缓存中了解他的运行机制及实现原理

强制缓存

有上面的图可知,强制缓存从缓存中找到数据后,会判断书否失效,呐他是如何判断的呢,根据什么呢?

上面我们已经提到过了,缓存规则是存在header里进行传递的,对于强制缓存来说,响应header中会有两个字段来标明失效规则(Expires/Cache-Control)

Expires

Expires的值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。
不过Expires 是HTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。
另一个问题是,到期时间是由服务端生成的,但是客户端时间可能跟服务端时间有误差,这就会导致缓存命中的误差。
所以HTTP 1.1 的版本,使用Cache-Control替代。

Cache-Control

Cache-Control 是最重要的规则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。
private: 客户端可以缓存
public: 客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的)
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 需要使用对比缓存来验证缓存数据(后面介绍)
no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发

在这里插入图片描述
这里 Cache-Control只有一个字段max-age,所以默认为private,在31536000秒后会失效,也就是说在规定时间都会直接从缓存中直接读取,也就是强制缓存

对比缓存

浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。
再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。

也就是说在对比缓存下如果使用缓存成功后返回的状态码就是304,没成功就是200
既然对比缓存存在一次客户端和服务端的校验,那么这种规则肯定就是在请求header和响应header中进行传递,那他是通过什么机制进行校验的呢,让我们来了解一下

一共有两种标识,我们分别介绍一下

Last-Modified / If-Modified-Since

Last-Modified 是服务端发送的标识,来告诉记录请求资源的最后一次修改时间
If-Modified-Since 是客户端发送给服务端的标识符,他储存的就是在之前服务端发给他的Last-Modified 的时间,服务端接收到之后就会与系统上最新的修改时间进行对比如果一样则说明有效,响应403,不一样则无效,会返回最新的数据及时间,响应200

可想403的速度快,因为不需要打包数据

Etag / If-None-Match(优先级高于Last-Modified / If-Modified-Since)

其实理论上差不多,只不过Etag存储的是一个唯一标识符,前者是服务器的,后者是客户端的,通过比较标识符是否一致,判断是否有效

总结

用两张图总结一下
在这里插入图片描述
在这里插入图片描述
相信大家应该都能明白,最后附上原文的链接:
http://www.cnblogs.com/chenqf/p/6386163.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值