HTTP缓存机制及原理

HTTP缓存机制及原理

Http缓存机制 Web 性能优化的重要手段,浏览器会对请求的静态文件进行缓存。

什么是浏览器缓存

浏览器缓存(Brower Caching)是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。

Http中的报文

HTTP中的报文就是浏览器和服务器间通信时发送及响应的数据块。

  • 浏览器向服务器发送Request报文
  • 服务器向浏览器返回Response报文

报文内容:

  • Header:cookie、缓存信息。。。
  • Body:请求传输的内容

Http中的缓存规则

根据向服务器发送请求来分类:

  1. 强制缓存

缓存未命中表示缓存失效

  1. 对比缓存

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

强制缓存

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

Expires(Http1.0)

Expires:是服务端返回的到期时间,下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据

Expires是HTTP1.0的东西,现在浏览器默认使用HTTP1.1
存在问题:客户端和服务端存在时间差,所以HTTP1.1版本,使用Cache-Control

Cache-Control(Http1.1)

一般情况使用的都是HTTP1。1
Cache-Control 是最重要的规则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。

  • private: 只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
  • public: 可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
  • max-age=xxx: 缓存的内容将在 xxx 秒后失效(常见)
  • no-store:直接禁止浏览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
  • no-cache: 直接禁止浏览器缓存数据,需要使用对比缓存来验证缓存数据。

对比缓存

浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将两者保存在浏览器缓存中。
第二次请求时,客户端将缓存标识发送给服务器,服务器根据缓存表识进行判断。

Last-Modified/ If-Modified-Since

Last-Modified:在第一次请求时Response中返回资源的最后修改时间。
If-Modified-Since:当再次Request中携带If-Modified-Since,服务器与被请求资源最后修改时间对比,时间大于就返回200,时间小于或等于就返回304。

Etag / If-None-Match

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

Etag:服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)
If-None-Match:再次请求服务器时,通过此字段通知服务器客户段缓存数据的唯一标识,服务器收到请求后发现有头If-None-Match 则与被请求资源的唯一标识进行比对。不同返回200,相同返回304。

两者区别
  1. 准确度:Last-Modified的时间单位是秒,如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有体现出来修改,但是Etag每次都会改变确保了精度。
  2. 性能:Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值。
  3. 优先级:服务器校验优先考虑Etag。

总结

  • 强制缓存:服务器通知浏览器一个缓存时间,在缓存时间内,下次请求直接用缓存。
  • 对比缓存:将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存,返回200就是一次新的请求。
  • 强制缓存优先级高于对比缓存
  • 在对比缓存中Etag要优于Last-Modified

浏览器缓存过程

  1. 浏览器第一次请求,服务器返回200,浏览器将服务器Response返回的缓存表识、缓存时间、数据保存。
  2. 第二次请求资源会在Request中携带缓存标识,先比较强缓存中cache-control的参数信息(不同参数不同请求)。
  3. 一般情况是设置的max-age,判断时间是否过期,没有过期直接读取(浏览器不支持HTTP1.1,则用expires判断是否过期),时间过期就使用对比缓存。
  4. 如果cache-control设置为no-cache,就直接使用对比缓存。
  5. 服务器在收到对比缓存的请求时,优先根据Etag值判断请求文件是否被修改,一致返回200,反之304。如果请求没有Etag,则将If-Modified-Since和被请求文件的最后修改时间做比对。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值