HTTP缓存?如何避免发送HTTP?Etag是什么?

在这里插入图片描述

缓存(Cache)是计算机领域里的一个重要概念,是优化系统性能的利器。

由于链路漫长,网络时延不可控,浏览器使用 HTTP 获取资源的成本较高。所以,非常有必要把“来之不易”的数据缓存起来,下次再请求的时候尽可能地复用。这样,就可以避免多次请求 - 应答的通信成本,节约网络带宽,也可以加快响应速度。

所谓的避免发送缓存指的是发送请求获得的数据是重复性的,得到的数据都是一致的。浏览器就会把这个请求缓存到本地,下次可以直接读取本地数据,不用重复发送HTTP请求,这样就会避免发送请求

具体流程

  1. 发送请求时浏览器查看是否有本地缓存,如果没有向服务器发送请求获得资源
  2. 服务器响应资源,标识资源有效期
  3. 浏览器缓存资源,以Url为key 响应的value为值保存在本地磁盘。等
    待下一次请求

那么你可能会问如何标识资源有效期?

在了解这个问题之前我们先了解下 “Cache-Control”这个字段标识服务器标识资源有效期如图:
在这里插入图片描述

max-age=43200 表示客户端只能缓存43200,过期就要重新发送请求

这里的 max-age 是“生存时间”(Time-To-Live),时间的计算起点是响应报文的创建时刻(即 Date 字段,也就是离开服务器的时刻),而不是客户端收到报文的时刻,也就是说包含了在链路传输过程中所有节点所停留的时间,所以这个时间和中间链路传输有很大关系

以上图为例max-age=4300 这个时候如果网络很糟糕传输过程中过去了5,浏览器收到后只有4295。就要减去在传输过程中占用的时间

Cache-Control 其他value 解释如图:
在这里插入图片描述

  1. no-store:不允许缓存,用于某些变化非常频繁的数据.
  2. no-cache:它的字面含义容易与 no-store 搞混,实际的意思并不是不允许缓存,而是可以缓存,但在使用之前必须要去服务器验证是否过期,是否有最新的版本。
  3. must-revalidate:又是一个和 no-cache 相似的词,它的意思是如果缓存不过期就可以继续使用,但过期了如果还想用就必须去服务器验证

在这里插入图片描述
缓存失效不是最新的如何去服务器验证

这个时候浏览器可以发送一个请求去验证服务器的缓存,但是这样很容易浪费资源没必要验证缓存重新发送请求.,那么浏览器是如何做的呢?先了解两个HTTP字段
ETag 是“实体标签”(Entity Tag)的缩写,是资源的一个唯一标识,主要是用来解决修改时间无法准确区分文件变化的问题。
If-None-Match 检查验证资源是否过期,把两个请求才能完成的工作合并在一个请求里做

具体流程

  • 浏览器发送请求 等待服务器响应
  • 服务器响应头返回一个带有 Etag的标识
  • 浏览器下次发送请求使用If-None-Match 带上Etag的值
  • 服务器收到后验证Etag如果没有发生变化就会返回304状态码告诉浏览器还是可以使用缓存的
    在这里插入图片描述

以上就是HTTP的缓存机制,由此可见缓存还是很强大的,不管是mysql缓存 cpu缓存 还是单独的缓存redis 都为现在的大数据请求节约了不少资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃橘子的汤圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值