浏览器缓存策略(协商缓存和强缓存)...面试再ye不怕系列

浏览器缓存

浏览器缓存是一种本地保存远端资源的机制,不管是在客户端,还是服务端存储,用相同的url进行数据请求,可以直接从缓存中请求资源,而不再访问服务器。

浏览器在本地对用户最近请求过的文档进行存储,当用户再次访问同一页面时,浏览就可以直接从本地存储中读取。浏览器缓存的意义:

  • 避免了冗余的数据传输,节省流量
  • 加快了用户访问速度
  • 减小了服务器的压力

浏览器缓存策略

第一次请求数据时,浏览器缓存中没有对应的缓存数据,此时需要请求服务器,浏览器返回数据后,会把请求数据缓存。

当浏览器中存在缓存数据后,可以根据是否需要向服务器发送请求,将缓存类型分为:强缓存和协商缓存

强缓存

命中强缓存(缓存未过期),则不会向服务器请求,而直接从本地资源获取,返回200状态码,并提示from disk cache或from memory cache

协商缓存

缓存过期,浏览器直接向服务器发送请求,协商对比服务端和本地的资源,验证本地资源是否失效。若服务器资源与本地相同,则命中协商缓存,返回304,否则直接请求服务器资源。

协商缓存的响应结果,不仅验证资源的有效性,同时还会更新浏览器缓存

Age:0 表示命中了代理服务器的缓存, age 值为 0 表示代理服务器刚刚刷新了一次缓存.

Cache-Control:max-age=600 覆盖 Expires 字段, 表示从 Date_value, 即 Wed, 05 Apr 2017 13:09:36 GMT 起, 10 分钟之后缓存过期. 因此 10 分钟之内访问, 将会命中强缓存

强缓存与协商缓存的关系

强缓存与协商缓存命中缓存资源后,都是从本地读取资源。如果强制缓存生效,则不需要在向服务器发出请求;而协商缓存,不管是否使用缓存,必须向服务器发送一个请求来协商。

两类缓存规则可以同时存在,强缓存优先级高于协商缓存,也就是说,当执行强缓存的规则时,如果缓存生效,直接使用缓存,不再执行协商缓存规则。如果强制缓存规则不生效,则需要进行协商缓存判断。

如何判断命中强缓存或者协商缓存呢?

强缓存

强缓存就是利用http协议头的Expires和Cache-Control来控制。

  1. Expires:其值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,即可直接使用缓存数据。不过expires是http1.0,即在默认浏览器均默认http1.1,所以基本忽略它。另一方面,到期时间是由服务端生成的,但是客户端时间可能跟服务端时间有误差,这就会导致缓存命中的误差,所以http1.1版本,使用Cache-control代替。
  2. Cache-Control:Cache-Control 是最重要的规则。常见的取值有private、public、no-cache、max-age等。

协商缓存

一般是使用 if-modified-since/Last-Modified 和 if-none-match/Etag 由服务器来决定浏览器缓存的资源是否可以使用。

  • Last-Modified / If-Modified-Since

Last-Modified:服务器响应请求时,告诉浏览器资源最后的修改时间。
If-Modified-Since:浏览器再次请求资源时,浏览器通知服务器,上次请求时,返回的资源最后修改时间。
若最后修改时间小于等于If-Modified-Since,则response header返回304,告知浏览器继续使用所保存的cache。若大于If-Modified-Since,则说明资源被改动过,返回状态码200;

  • If-none-match / Etag

Etag:服务器响应请求时,告诉浏览器当前资源在浏览器的唯一标识(生成规则由服务器确定)
If-None-Match:再次请求服务器时,通过此字段通知服务器客户端缓存数据的唯一标识。服务器收到请求后发现有If-None-Match 则与被请求资源的唯一标识进行比对,不同,说明资源又被改动过,则响应整片资源内容,返回状态码200;相同,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。

总结

  1. 浏览器第一次请求数据时,浏览器缓存中没有对应的缓存数据,此时需要请求服务器,浏览器返回数据后,会把请求数据缓存。
  2. 浏览器再次访问同一url,则会根据请求资源是否过期向服务器发送不同请求,此时分为强缓存和协商缓存。
  3. 若资源未过期(Expires和Cache-Control),则会命中强缓存,不会像服务器发送请求,直接从本地获取。
  4. 若资源显示过期(if-modified-since/Last-Modified 和 if-none-match/Etag),则会向服务器发送请求,协商对比服务端资源和本地资源,验证是否失效。若相同,则命中协商缓存,返回304,否则直接请求服务器。

参考这里

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值