http缓存

前言

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

  • 减少冗余的数据传输
  • 减少服务器负担
  • 加快客户端加载网页的速度

  在浏览器第一次发起请求时,本地无缓存,向web服务器发送请求,服务器起端响应请求,浏览器端缓存。过程如下:

  1. 在第一次请求时,服务器会将页面最后修改时间通过Last-Modified标识由服务器发送给客户端,客户端记录修改时间;服务器还会生成一个Etag,并发送给客户端。
  2. 浏览器后续再次进行请求时:
    浏览器缓存主要分为强强缓存(也称本地缓存)和协商缓存(也称弱缓存)。根浏览器在第一次请求发生后,再次发送请求时:

  浏览器请求某一资源时,会先获取该资源缓存的header信息,然后根据header中的Cache-Control和Expires来判断是否过期。若没过期则直接从缓存中获取资源信息,包括缓存的header的信息,所以此次请求不会与服务器进行通信。这里判断是否过期,则是强缓存相关。

  如果显示已过期,浏览器会向服务器端发送请求,这个请求会携带第一次请求返回的有关缓存的header字段信息,比如客户端会通过If-None-Match头将先前服务器端发送过来的Etag发送给服务器,服务会对比这个客户端发过来的Etag是否与服务器的相同,若相同,就将If-None-Match的值设为false,返回状态304,客户端继续使用本地缓存,不解析服务器端发回来的数据,若不相同就将If-None-Match的值设为true,返回状态为200,客户端重新机械服务器端返回的数据;客户端还会通过If-Modified-Since头将先前服务器端发过来的最后修改时间戳发送给服务器,服务器端通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回最新的内容,如果是最新的,则返回304,客户端继续使用本地缓存。

强制缓存

  1. 当缓存数据库中已有所请求的数据时。客户端直接从缓存数据库中获取数据。当缓存数据库中没有所请求的数据时,客户端的才会从服务端获取数据。
  2. 强缓存是利用http头中的Expires和Cache-Control两个字段来控制的,用来表示资源的缓存时间。强缓存中,普通刷新会忽略它,但不会清除它,需要强制刷新。浏览器强制刷新,请求会带上Cache-Control:no-cache和Pragma:no-cache
    在这里插入图片描述

  对于强制缓存,服务器响应的header中会用两个字段来表明——Expires和Cache-Control。

Expires

  Exprires的值为服务端返回的数据到期时间。当再次请求时的请求时间小于返回的此时间,则直接使用缓存数据。但由于服务端时间和客户端时间可能有误差,这也将导致缓存命中的误差,如果同时出现Cache-Control:max-age和Expires,那么max-age优先级更高。另一方面,Expires是HTTP1.0的产物,故现在大多数使用Cache-Control替代。

cache-control:max-age=691200
expires:Fri, 14 Apr 2017 10:47:02 GM
那么表示资源可以被缓存的最长时间为691200秒,会优先考虑max-age。

Cache-Control

  Cache-Control是在http1.1中出现的,主要是利用该字段的max-age值来进行判断,它是一个相对时间,例如Cache-Control:max-age=3600,代表着资源的有效期是3600秒。cache-control除了该字段外,还有下面几个比较常用的设置值:

  - private:客只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
  - public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
  - max-age=t:缓存内容将在t秒后失效
  - no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
  - no-store:直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。

注: Cache-Control与Expires可以在服务端配置同时启用,同时启用的时候Cache-Control优先级高。

协商缓存

  又称对比缓存,客户端会先从缓存数据库中获取到一个缓存数据的标识,得到标识后请求服务端验证是否失效(新鲜),请求响应返回的http状态为304并且会显示一个Not Modified的字符串,此时客户端直接从缓存中获取所请求的数据,如果标识失效,则将资源返回客户端,并更新本地缓存数据,并返回200的状态码。
在这里插入图片描述

  两类缓存机制可以同时存在,强制缓存的优先级高于协商缓存,当执行强制缓存时,如若缓存命中,则直接使用缓存数据库数据,不在进行缓存协商。
  可以看到,在这个实现了协商缓存的Cache-Control中,设置了no-catch,当我们设置为no-catch时,我们就是可以直接去访问服务器,去查看该资源的更改情况,已确定是是否需要使用缓存。

Last-Modified与If-Modified-Since

  Last-Modified:表示这个响应资源的最后修改时间。web服务器在响应请求时,会告诉浏览器该资源的最后修改时间,但它的最小单位是秒级,也就是如果我们在1秒内多次修改该资源,那么Last-Modified也无法发挥其应有的作用。
  If-Modified-Since:当资源过期时(强缓存失效),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache。

Etag与If-None-Match

由于 Last-Modified存在着缺陷,我们就需要ETag来帮助我们来对资源的更改进行判断
  Etag:当Web服务器响应请求时,会告诉浏览器当前资源在服务器的唯一标识(生成规则是由服务器决定的)。就比如在Apache中,ETag的值,其默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。
  If-None-Match:当资源过期时,如果发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match (Etag的值)。Web服务器收到请求后发现有头If-None-Match, 就会将其被请求的资源的相应校验字段进行对比,然后再决定返回200或304。

缓存的优点

  • 减少了冗余的数据传递,节省宽带流量
  • 减少了服务器的负担,大大提高了网站性能
  • 加快了客户端加载网页的速度 这也正是HTTP缓存属于客户端缓存的原因。

不同刷新的请求执行过程

  • 浏览器地址栏中写入URL,回车,浏览器发现缓存中有这个文件了,不用继续请求了,直接去缓存拿。(最快)
  • F5,F5就是告诉浏览器,别偷懒,好歹去服务器看看这个文件是否有过期了。于是浏览器就胆胆襟襟的发送一个请求带上If-Modify-since。
  • Ctrl+F5,告诉浏览器,你先把你缓存中的这个文件给我删了,然后再去服务器请求个完整的资源文件下来。于是客户端就完成了强行更新的操作.

总结

浏览器发起请求

  • 检查是否有缓存
  • 有Pragma字段 no-cache 强制请求 新资源
  • 有缓存并且没有Pragma,先判断缓存是否过期(Cache-Control 优先于 Expires),没有过期就使用缓存
  • 缓存有效时间过期了,查看是否使用了Eatg 和 Last-Modified 头部
  • 发送 If-none-Match 和 If-Modified-Since 去验证是否缓存还能继续使用(可能缓存到期了,但是服务端没有修改,而资源又比较大,通过校验可以减少网络传输)
  • 资源没有修改就使用缓存

缓存字段

  1. Expires
  • 一般使用Cache-Control和Expires共存,主要是为了兼容http1.0
  • Expires返回的是服务器时间,需要考虑服务器与客户端的时间同步(时区等)
  • 过期之后重新返回的响应中要加入新的Expires
  1. Cache-Control
  • max-age 过期时间是一个时间段,从接受到这个响应之后开始生效,过期之后任然可以使用这个时间段
  • max-age 和 Expires 共存的时候使用max-age
  • no-cache 表示可以缓存,但是在使用缓存之前需要向服务器验证
  • no-store 不缓存
  1. Last-Modified
  • 用来标识服务端最后一次修改资源的时间
  • 配合If-Modified-Since使用,检查缓存与服务端是否一致
  1. Etag
  • 服务端资源的唯一标识,看作一种数字签名
  • 当资源没有发送变化的情况下,Etag计算值不发生变化
  • 当有多个服务端的情况下,需要保证不同服务器上的Etag计算方式一致
  • 需要额外的计算Etag的资源
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值