HTTP1.1缓存策略

  以下是一幅虽然信息包含量有限、但足够以最简洁的方式说明了“什么是HTTP1.1缓存策略”的图

  缓存和缓存策略

  web缓存(web cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器。缓存减少了冗余数据的传输、缓解带宽瓶颈、

  降低距离时延。

  缓存策略就是在采用缓存的情况,client、proxy cache、server三者是如何协同工作,实现正确且快速的数据传递。

  在介绍缓存策略前,我们需要先明确的概念

 (a)缓存命中

 (b)缓存未命中

 (c)缓存再验证命中

  出现以上三种情况的原因是缓存是否有效。很明显,当缓存有效的时候,我们肯定希望从缓存中获得数据,那怎么判断缓存是否有效呢?这就是接下来需要讨论的问题——新鲜度检测。与之相关的是两个很重要的头部,Expires和Cache-control:max-age,其中Expires来自http/1.0+,Cache-Control来自http/1.1。其中Cache-Control:max-age定义了文档的使用期,是一个相对时间,如Cache-Control:max-age=3600,单位为秒;Expires指定的是一个绝对时间。很明显相对时间比绝对时间靠谱多了。因为绝对时间是依赖于计算机时钟的设定的。但是很多时候两者都被设定了,主要原因是有些客户端不支持http/1.1,无法识别Cache-Control,这是一种兼容策略。当然,Expires和Cache-control同时存在的时候,Cache-Control的优先级是高于Expires的。

  

  我们还需要明确的一点就是——当文档在过期时间以内的时候,文档时新鲜的,即缓存和原始服务的数据是相吻合的,这一点我们承认,但是单单一个Expires或者是Cache-Control头部就说明缓存已经和原始服务器数据出现偏差,呈现无效状态,这种说法显然是欠考虑的。在文档过期时,缓存可以问下原始服务器,文档在某段时间后有没有发生变化,如果内容没有变化,缓存只要获取一个新的过期时间,重新标识缓存为有效,并将缓存中的数据响应给客户端,这就是缓存再验证命中;而如果缓存内容发生了变化,缓存需要得到新的数据信息,更新旧缓存,并将新的数据响应给客户端,这就是缓存未命中。~而这种缓存向原始服务器询问,就是“服务器再验证”。

  与“服务器再验证”相关的最有用的头部是If-Modified-Since:<date>和If-None-Match:<tags>  

  If-Modified-Since和Last-Modified服务器响应首部

  当缓存要对已缓存的文档进行再验证时,就会包含一个If-Modified-Since首部,其中有最后修改已缓存副本的日期,如果在此期间内容被修改,最后的修改日期就会有所不同,原始服务器就会返回新的文档以及一个新的过期时间;否则返回一个304 NOT Modified的响应,没有文档主体返回,但会返回一个新的过期时间。

  If-None-Match实体标签再验证

  If-None-Match的存在是因为If-Modify-Since仅仅以文档最后修改的时间为依据进行判断是够的。以下情况在合理的需求范围之内的,比如:

  1.  有些文档可能被周期性的重写,但是数据可能是一样的,这样虽然文档的内容没有发生变化,但是文档的修改时间却发生了变化。

  2.  有些文档虽然修改了,但是修改并不重要,因此不需要更新所有的缓存。

  3.  有些服务器无法准确的判断文档的最后修改时间或无法正确的支持If-Modified-Since(比如,有的服务器是使用日期的字符串匹配比较而不是日期比较)

  4.  对于文档变化小于1s的实时监控类应用,1s的粒度太大,需要更加精细的粒度控制。

  Etag标签作为文档的版本号、序列号、指纹或者校验信息等参与再验证,并且Etag可以有多个。当第一次访问文档时,服务响应会包含ETag信息,然后之后再客户端请求时就会将最近的Etag信息添加到If-None-Match中,如果Etag匹配,服务器就会响应304 NOT Modified,否则服务器会返回新的文档和新的Etag。

 有关缓存的其它头部信息:Cache-Control、Pragma

  Cache-Control

  cache-control作为请求头部的一部分时,可取的值为:max-age、max-stale、min-fresh、no-cache、no-store、no-transform、only-if-cached

  max-age:如果指定max-age的值,那么在此值内的时间里是不会重新访问原始服务器的。比如,Cache-Control:max-age=5,表示当访问此网页后的5秒内不会再次访问服务器;

  max-stale:客户端可以接受这个超过新鲜度的响应对象,但是前提条件是该响应时间的过期时间必须小于max-stale;

  min-fresh:接受其新鲜生命期大于其当前age+min-fresh值的缓存对象;

  no-cache:不是说不被缓存,而是会被缓存,只不过每次在向客户端提供响应数据时,缓存都要向原始服务器再验证缓存的有效性;

  no-store:响应不被缓存;

  no-transform:RFC里面的原话叫做“The no-transform” request directive indicates that an intermediary(whether or not it implements a cache) MUST NOT transfor the payload"。 当指定了该字段后,中间任何环节都不能再修改有效载荷。=。=其实我不太明白,不过脑子里有点印象,代理可以修改http头部,可能指的就是这个,待考证。。。。

  only-if-cached:客户端希望响应来自缓存;所以作为响应有两种结果,一种是来自缓存的数据,一种是504响应;

  cache-control作为响应头部的一部分时,可取的值为:must-revalidate、no-cache、no-store、no-transform、public、private、proxy-revalidate、max-age、s-maxage。

  must-revalidate:缓存必须在向原始服务器再验证成功之后才可以再使用,否则将会响应504;

  public:任何缓存代理都可以缓存服务器的响应;

  private:响应针对私人用户,不能被共有缓存代理缓存下来;

  proxy-revalidate:同样要求向原始服务器再验证,但是对私有缓存无效;

  s-maxage:同max-age,但他只用于共享缓存;

  Pragma

  跟Cache-Control:no-cache相同,Pramma: no-cache兼容http 1.0,Cache-Control:no-cache是http1.1提供的。因此,Pragma:no-cache可以应用到http1.0和http1.1,而Cache-Control:no-cache只能应用于http1.1。  

  有没有想过,我们讨论都是http/1.1的策略,假如我们的策略碰上了一个老服务器、老客户端,会发生什么情况呢?本着一个原则,坚决不返回错误信息,以牺牲效率保证正确性。  

  

  如果撇开细节不谈,缓存策略总结起来就是:实现client、cache、server三者之间最有效、最对等的信息交流。最有效包括时间有效、准确性的有效,时间的有效通过最大限度的利用缓存,减少交流成本(新鲜度检测时,只需要发送头部信息,只有的实在很必要的时候才发送文档主体,减少通信的数据传输量就是依照这个原则)以实现;准确性的有效同样是采用新鲜度检测的措施;最对等的信息交流就是server返回一个头部信息、client要有相应的头部信息最为响应发回。

时间: 2024-08-07 16:59:14

HTTP1.1缓存策略的相关文章

【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李志刚 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后依然不明白其原因,可谓相当的郁闷呢!!为了确认下是否只是自己理解不深,我特意请教了其他几位小伙

缓存策略

一.前言 缓存思想是计算机领域最伟大的思想之一,缓存对web应用有多重要,大家可以百度一下雅虎前端性能优化军规,看看启用缓存的排序有多靠前.对服务端而言缓存也异常重要,memcache已经变成互联网产品的标配,缓存服务器一旦停止工作,大量获取数据的请求涌入数据库导致数据库运行缓慢,进而导致整个系统响应缓慢甚至崩溃,这就是“雪崩现象”.当然,今天我们要聊的主要是前端静态资源服务器应该采用的缓存策略.   二.常见的缓存策略 (1)Expires 设置失效时间,精确到时分秒 (2)Cache-Con

Web开发基本准则-55实录-缓存策略

郑昀 创建于2013年2月 郑昀 最后更新于2013年10月26日 提纲: Web访问安全 缓存策略 存储介质连接池 业务降级 并发请求的处理 关键词: 会话串号,Cache-Control头域,缓存穿透,缓存集体失效,缓存重建,缓存雪崩,缓存永不过期,缓存计数器, 二,缓存策略 这里的“缓存”概念不只限于服务器端的“缓存”. 2.1.防会话串号 如果你收到一个投诉,说访问“我的个人中心”页面时进入其他人的帐号,至少订单列表上显示的不是自己的.此时,技术支持人员可以提三个问题,第一,对页面上显示

【转载】HTTP 缓存的四种风味与缓存策略

原文地址:https://segmentfault.com/a/1190000006689795 HTTP Cache 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本.因此,缓存和重用以前获取的资源的能力成为优化性能很关键的一个方面.每个浏览器都实现了 HTTP 缓存! 我们所要做的就是,确保每个服务器响应都提供正确的 HTTP 头指令,以指导浏览器何时可以缓存响应以及可以缓存多久.服务器在

彻底弄懂 HTTP 缓存机制 —— 基于缓存策略三要素分解法

导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后依然不明白其原因,可谓相当的郁闷呢!!为了确认下是否只是自己理解不深,我特意请教了其他几位小伙伴,发现情况也或多或少和我类似. 为了不给大家卖关子,下面我贴出2道题,大家可以尝试解答下: 以下为 page.html 内容: <!DOCTYPE html><html xmlns="h

Web缓存基础:术语、HTTP报头和缓存策略

简介 对于您的站点的访问者来说,智能化的内容缓存是提高用户体验最有效的方式之一.缓存,或者对之前的请求的临时存储,是HTTP协议实现中最核心的内容分发策略之一.分发路径中的组件均可以缓存内容来加速后续的请求,这受控于对该内容所声明的缓存策略. 在这份指南中,我们将讨论一些Web内容缓存的基本概念.这主要包括如何选择缓存策略以保证互联网范围内的缓存能够正确的处理您的内容.我们将谈一谈缓存带来的好处.副作用以及不同的策略能带来的性能和灵活性的最大结合. 什么是缓存(caching)? 缓存(cach

网络图片的获取以及二级缓存策略(Volley框架+内存LruCache+磁盘DiskLruCache)

在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理,每次打开应用都去网络获取图片,那么用户可就不乐意了,这里的处理就是指今天要讲的缓存策略(缓存层分为三层:内存层,磁盘层,网络层). 关于缓存层的工作,当我们第一次打开应用获取图片时,先到网络去下载图片,然后依次存入内存缓存,磁盘缓存,当我们再一次需要用到刚才下载的这张图片时,就不需要再重复的到网络

Hibernate(四)——缓存策略+lazy

Hibernate作为和数据库数据打交道的框架,自然会设计到操作数据的效率问题,而对于一些频繁操作的数据,缓存策略就是提高其性能一种重要手段,而Hibernate框架是支持缓存的,而且支持一级和二级两种缓存,合理的使用缓存策略可以大大提高我们的操作数据效率,但是利用不能,可能会造成不必要的麻烦.  一,一级缓存(Session缓存):  Session缓存表示将查询结果放置到Session的临时存储空间(一级缓存中).Hibernate框架默认支持一级缓存的.一级缓存的范围较小,一旦Sessio

浏览器缓存策略

浏览器一般缓存图片.CSS.JS等静态文件,因为这些文件的更新频率相对来说比较低,合理利用浏览器的缓存对网站的性能提升有很大帮助.HTTP缓存分为两部分,分别是本地缓存和缓存协商,当本地缓存不生效时会启用缓存协商.HTTP缓存主要由HTTP协议的头(Header)信息来制定. 本地缓存 本地缓存是指当浏览器请求资源时,如果命中了浏览器本地的缓存资源,那么浏览器就不会发送真正请求给服务器.它的执行过程是:1. 第一次浏览器发送请求给服务器时,此时浏览器还没有本地缓存副本,服务器返回资源给浏览器,响