写给后端程序员的HTTP缓存原理介绍

点击上方“bj码帮”蓝字可以订阅喔!

通过Intrnt获取资源既缓慢,成本又高。为此,Http协议里包含了控制缓存的部分,以使Http客户端可以缓存和重用以前获取的资源,从而优化性能,提升体验。虽然HTTP中关于缓存控制的部分,随着协议演进,有一些变化。但我觉着,作为后端程序员,在开发Wb服务时,只需要   缓存在哪儿?

  上图中有三个角色,浏览器、Wb代理和服务器,如图所示Http缓存存在于浏览器和Wb代理中。当然在服务器内部,也存在着各种缓存,但这已经不是本文要讨论的Http缓存了。所谓的HTTP缓存控制,就是一种约定,通过设置不同的响应头Cach-Control来控制浏览器和Wb代理对缓存的使用策略,通过设置请求头If-Non-Match和响应头ETag,来对缓存的有效性进行验证。

  响应头ETag

  ETag全称EntityTag,用来标识一个资源。在具体的实现中,ETag可以是资源的hash值,也可以是一个内部维护的版本号。但不管怎样,ETag应该能反映出资源内容的变化,这是HTTP缓存可以正常工作的基础。

  如上例中所展示的,服务器在返回响应时,通常会在HTTP头中包含一些关于响应的元数据信息,其中,ETag就是其中一个,本例中返回了值为x12ddx的ETag。当资源/fil的内容发生变化时,服务器应当返回不同的ETag。

  请求头If-Non-Match

  对于同一个资源,比如上一例中的/fil,在进行了一次请求之后,浏览器就已经有了/fil的一个版本的内容,和这个版本的ETag,当下次用户再需要这个资源,浏览器再次向服务器请求的时候,可以利用请求头If-Non-Match来告诉服务器自己已经有个ETag为x12ddx的/fil,这样,如果服务器上的/fil没有变化,也就是说服务器上的/fil的ETag也是x12ddx的话,服务器就不会再返回/fil的内容,而是返回一个04的响应,告诉浏览器该资源没有变化,缓存有效。

  如上例中所示,在使用了If-Non-Match之后,服务器只需要很小的响应就可以达到相同的结果,从而优化了性能。

  响应头Cach-Control

  每个资源都可以通过Http头Cach-Control来定义自己的缓存策略,Cach-Control控制谁在什么条件下可以缓存响应以及可以缓存多久。最快的请求是不必与服务器进行通信的请求:通过响应的本地副本,我们可以避免所有的网络延迟以及数据传输的数据成本。为此,HTTP规范允许服务器返回一系列不同的Cach-Control指令,控制浏览器或者其他中继缓存如何缓存某个响应以及缓存多长时间。

Cach-Control头在HTTP/1.1规范中定义,取代了之前用来定义响应缓存策略的头(例如Expirs)。当前的所有浏览器都支持Cach-Control,因此,使用它就够了。

  以下我来介绍可以再Cach-Control中设置的常用指令。

  max-ag

  该指令指定从当前请求开始,允许获取的响应被重用的最长时间(单位为秒。例如:Cach-Control:max-ag=60表示响应可以再缓存和重用60秒。需要注意的是,在max-ag指定的时间之内,浏览器不会向服务器发送任何请求,包括验证缓存是否有效的请求,也就是说,如果在这段时间之内,服务器上的资源发生了变化,那么浏览器将不能得到通知,而使用老版本的资源。所以在设置缓存时间的长度时,需要慎重。

  public和privat

  如果设置了public,表示该响应可以再浏览器或者任何中继的Wb代理中缓存,public是默认值,即Cach-Control:max-ag=60等同于Cach-Control:public,max-ag=60。

  在服务器设置了privat比如Cach-Control:privat,max-ag=60的情况下,表示只有用户的浏览器可以缓存privat响应,不允许任何中继Wb代理对其进行缓存-例如,用户浏览器可以缓存包含用户私人信息的HTML网页,但是CDN不能缓存。

  no-cach

  如果服务器在响应中设置了no-cach即Cach-Control:no-cach,那么浏览器在使用缓存的资源之前,必须先与服务器确认返回的响应是否被更改,如果资源未被更改,可以避免下载。这个验证之前的响应是否被修改,就是通过上面介绍的请求头If-Non-match和响应头ETag来实现的。

需要注意的是,no-cach这个名字有一点误导。设置了no-cach之后,并不是说浏览器就不再缓存数据,只是浏览器在使用缓存数据时,需要先确认一下数据是否还跟服务器保持一致。如果设置了no-cach,而ETag的实现没有反应出资源的变化,那就会导致浏览器的缓存数据一直得不到更新的情况。

  no-stor

  如果服务器在响应中设置了no-stor即Cach-Control:no-stor,那么浏览器和任何中继的Wb代理,都不会存储这次相应的数据。当下次请求该资源时,浏览器只能重新请求服务器,重新从服务器读取资源。

  怎样决定一个资源的Cach-Control策略呢?

  下面这个流程图,可以帮到你。

每天一句:

Godmadrlativs.ThankGodwcanchoosourfrinds.

神决定了谁是你的亲戚,幸运的是在选择朋友方面他给了你留了余地

码帮







































白癜风治疗时间
治疗白癜风要多少钱



转载请注明:http://www.guyukameng.com/jsp/1420.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了