浅谈HTTP缓存机制及原理

说道HTTP缓存,相信大家首先想到的是浏览器缓存,也就是我们常见的HTTP304的状态(重定向),浏览器会对请求过的静态文件进行缓存,但是为什么会缓存呢,这就不是很清楚了,下边我们慢慢来看

谈缓存之前,先来说一下HTTP报文的知识吧

http报文就是浏览器与服务器之间通信时发送及响应的数据块。浏览器向服务器请求数据,发送请求(request)报文;服务器向浏览器返回数据,返回响应(response)报文

  • header--属性的头部,附加信息(cookie,缓存信息等)与缓存相关的规则信息,均包含在header中
  • body--包含数据的主体,真正传输的部分

缓存规则

为了方便理解,我们可以认为浏览器存在一个缓存数据库,用于存储缓存信息,当客户端第一次请求数据时,此时缓存数据库中没有对应的缓存信息,需要请求服务器,服务器返回后,将数据存储在缓存数据库中,大致流程就是这个样子

缓存规则

 

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

强制缓存:

  • 缓存命中--客户端请求数据时,缓存命中,并且有缓存数据且未失效,则可以从缓存数据库中取出数据返回给客户端
  • 缓存未命中--客户端请求数据时,缓存未命中,则从缓存数据库中取数据失败,需要向服务器重新请求数据,服务器返回数据和缓存规则给客户端,客户端将数据和缓存规则存入缓存数据库中

强制缓存

对比缓存:

  • 缓存命中--当缓存命中的时候,客户端向缓存数据库中获取缓存数据的标识,然后再请求服务器验证缓存数据标识符对应的数据是否失效,最后服务器返回客户端一个缓存未失效的通知,服务器再获取缓存数据
  • 缓存未命中--还是从缓存数据库中获取缓存数据的标识,然后向服务器验证缓存数据标识对应的数据源是否失效,但是这个返回的是最新的数据和缓存规则,在将数据和缓存规则存入缓存系统

对比缓存

可以发现,强制缓存如果生效,就不需要再和服务器发生交互,而对比缓存不管是否生效,都需要与服务器发生交互。两种缓存规则可以同时存在,强制缓存优先级高于对比优先级

强制缓存

浏览器是如何判断数据是否失效呢?

我们知道,在没有缓存数据的时候,浏览器请求数据时,服务器会将数据和缓存规则一并返回,缓存信息包含在响应的header中,它有两个字段来标明失效规则(Exprise/Cache-Control)

Exprise--服务器返回的到期时间,即下一次请求时,请求时间小于服务器返回的到期时间,直接使用缓存数据!!不过Exprise是HTTP1.0的东西,现在不咋使用,而且客户端时间有可能跟服务端时间有误差,会导致缓存命中的误差

Cache-Control--是最重要的规则,常见的取值:

  • private:默认的,客户端可以缓存
  • public:客户端和代理服务器都可以缓存
  • max-age=xxx:缓存内容将在xxx秒后失效
  • no-cache:需要使用对比缓存来验证缓存数据
  • no-sore:所有内容都不会被缓存

对比缓存

客户端将从缓存数据库中取出的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据

通过对比可以发现报文大小和请求时间大大减少,原因是,服务端进行标识符比较后,只会返回header部分,通过状态码通知客户端使用缓存,不需要将报文主体返回给客户端

Last-Modified--告诉浏览器资源最后修改的时间

If-Modified-Since--再次请求服务器时,通过次字段通知服务器上次请求时,服务器返回的资源最后修改的时间,服务器拿这个字段和被请求资源最后修改的时间比较,若大于,说明修改过返回200,否则返回304继续使用缓存

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

If-None-Match--再次请求时服务器收到这个信息,与被请求的资源唯一标识符进行对比,看是否相同,返回200或304。。。这就不细说啦

总结

对比强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,当浏览器再次请求时直接使用缓存,不在时间内,则使用对比缓存的策略,将缓存信息中的Etag和Last-Modified,由服务器校验返回304或者200

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值