HTTP缓存:强制缓存与协商缓存

一;缓存的基本概念:

缓存是一种保存资源副本并在下次请求时直接使用该副本的技术。

我们使用 HTTP 缓存,通过复用缓存资源,减少了客户端等待时间和网络流量,同时也能缓解服务器端的压力。可以显著的提升我们网站和应用的性能。

虽然 HTTP 缓存不是必须的,但重用缓存的资源通常是必要的,HTTP 缓存是一个 web 性能优化的重要手段。

二;HTTP缓存类型:

在 HTTP 中,我们可以通过设置响应头以及请求头来控制缓存策略。

1.强制缓存:

概念:浏览器把服务端返回的资源缓存在本地,双方规定一个时间,在这个时间内,浏览器不会向服务器请求该资源,而是直接复用本地缓存资源,只有当过了约定时间才会重新向服务器发送请求获取该资源。

强制缓存使用的响应头与请求头字段:

强缓存可以通过设置 Expires Cache-Control 两种响应头实现。如果同时存在,Cache-Control优先级高于Expires

Expires(HTTP1.0的属性)

  • 响应头,代表资源过期时间,由服务器返回提供,是HTTP1.0的属性,在与 max - age 共存的情况下优先级低
  • 规定的时间为绝对时间,客户端与服务端的时间时差或误差等因素可能造成客户端与服务端的时间不一致,将导致缓存命中的误差
  • 代表该资源的过期时间,其值为一个绝对时间。它告诉浏览器在过期时间之前可以直接从浏览器缓存中存取数据。

Cache-Control

  • 主要用表示资源缓存的最大有效时间。即在该时间端内,客户端不需要向服务器发送请求。优先级高于 Expires。其过期时间指令的值是相对时间,它解决了绝对时间的带来的问题。
  • Cache-Control 是 HTTP/1.1 中新增的属性,在请求头和响应头中都可以使用,常用的属性值:

    • max-age=x(单位秒):缓存时间计算的方式是距离发起的时间的秒数,超过间隔的秒数缓存失效
    • s-maxage=x(单位秒):代理服务器请求源站缓存后的X秒不再发起请求,只对CDN缓存有效。
    • no-cache:不使用强缓存,需要与服务器验证缓存是否新鲜
    • no-store:禁止使用缓存(包括协商缓存),每次都向服务器请求最新的资源
    • private:专用于个人的缓存,只有客户端可以缓存,中间代理、CDN 等不能缓存此响应
    • public:响应可以被中间代理、CDN 等缓存,即客户端和代理服务器 CDN 都可缓存
    • must-revalidate:在缓存过期前可以使用,过期后必须向服务器验证

2.协商缓存:

概念:当浏览器的强缓存失效的时候或者请求头中设置了不走强缓存,并且在请求头中设置了If-Modified-Since 或者 If-None-Match 的时候,会将这两个属性值到服务端去验证是否命中协商缓存,如果命中了协商缓存,会返回 304 状态,加载浏览器缓存,并且响应头会设置 Last-Modified 或者 ETag 属性。

概念:在浏览器与服务器约定资源过期时间的基础上,通过 Last-Modified If-Modified-Since 和    ETag / If-None-Match 这两对实现协商缓存。Etag 优先级高于 Last-Modified。

协商体现在:服务器不但返回给浏览器一个约定过期时间,还会给定一个文件标识,当浏览器重新向服务器发送请求时,会先进行双方文件标识的核对,以此来检验服务器存储的该文件是否被修改过,如果被修改过,则服务器会将最新的修改过的文件发送给浏览器,如果文件没有被修改过,则服务器返回304状态码,浏览器继续读取缓存中的文件。

Last-Modified、If-Modified-Since

Last-ModifiedIf-Modified-Since 的值都是 GMT 格式的时间字符串,代表的是文件的最后修改时间。

  1. 在服务器在响应请求时,会通过Last-Modified告诉浏览器资源的最后修改时间。
  2. 浏览器再次请求服务器的时候,请求头会带上上一次响应头中的 Last-Modified 的时间,并放到 If-Modified-Since 请求头属性中。
  3. 服务端收到此请求头发现有if-Modified-Since,则与被请求资源的最后修改时间进行对比,如果一致则返回 304 和响应报文头,浏览器只需要从缓存中获取信息即可。如果已经修改,那么开始传输响应一个整体,服务器返回:200 OK

但是在服务器上经常会出现这种情况,一个资源被修改了,但其实际内容根本没发生改变,会因为Last-Modified时间匹配不上而返回了整个实体给客户端(即使客户端缓存里有个一模一样的资源)。为了解决这个问题,HTTP/1.1 推出了 Etag。Etag 优先级高与Last-Modified

Etag、If-None-Match

Etag都是服务器为每份资源生成的唯一标识,就像一个指纹,资源变化都会导致 ETag 变化,跟最后修改时间没有关系,ETag可以保证每一个资源是唯一的。

在浏览器发起请求,浏览器的请求报文头会包含 If-None-Match 字段,其值为上次返回的Etag发送给服务器,服务器接收到请求报文后发现 If-None-Match 则与被请求资源的唯一标识进行对比。如果相同说明资源没有修改,则响应返回 304,浏览器直接从缓存中获取数据信息。如果不同则说明资源被改动过,则响应整个资源内容,返回状态码 200。

总结:

通过前文,我们了解到 HTTP 缓存主要分:

  • 强制缓存
  • 协商缓存。

强制缓存由 Cache-ControlExipres(HTTP1.0)控制。浏览器直接读本地缓存,不会再跟服务器端交互,状态码 200。

协商缓存由 Last-Modified / IfModified-SinceEtag /If-None-Match实现,每次请求需要让服务器判断一下资源是否更新过,从而决定浏览器是否使用缓存,如果是,则返回 304,否则重新完整响应。

参考文章:

HTTP 缓存 - 掘金 (juejin.cn)

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值