以下是一幅虽然信息包含量有限、但足够以最简洁的方式说明了“什么是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要有相应的头部信息最为响应发回。

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

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

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...

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

    续上篇<Web开发基本准则-55实录-Web访问安全>. Web开发基本准则-55实录-缓存策略 郑昀 创建于2013年2月 郑昀 最后更新于2013年10月26日 提纲: Web访问安全 ...

  3. Http协议:彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    转载:http://mp.weixin.qq.com/s/uWPls0qrqJKHkHfNLmaenQ 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必 ...

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

    原文地址:https://segmentfault.com/a/1190000006689795 HTTP Cache 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通 ...

  5. 【转】理解Java Integer的缓存策略

    本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的一个有助于节省内存.提高性能的特性.首先看一个使用 Integer 的示例代码,展示了 Integer 的缓存行为 ...

  6. Redis的缓存策略和主键失效机制

    作为缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略. >>EXPIRE主键失效机制 在Redis当中,有生存期的key被称为volatile,在创建缓存时,要为给定的key设置 ...

  7. 腾讯QQ你的缓存策略应该改下了

    缓存策略基本原则大家都怎么考虑的? 缓存好友数量这个也是醉了,这个数字好像变化频率有点低吧,ok,就算你企鹅用户量大,需要缓存,那肉肉的问一句你这更新策略也不能只管网上涨的,不管往下降的吧?难不成你是 ...

  8. 理解Java Integer的缓存策略

    转载自http://www.importnew.com/18884.html 本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的一个有助于节省内存.提高性能的特性. ...

  9. Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 本篇文章 ...

随机推荐

  1. phpcms v9 中get的mysql查询表某字段最大值数据,表某字段不重复数据

    直切正题 1.表tb中字段num最大的数据 {pc:get $sql="select * from tb where num=(select MAX(num) from tb)"} ...

  2. devexpress 数据导入(gridcontrol 导出 csv)

    // 1.gridcontrol 导出 csv: DataTable dtbNew = new DataTable(); dtbNew.Columns.Add().GetType()); dtbNew ...

  3. SQLServer2005,2000获取表结构:字段名、类型、长度、主键、非空、注释

    SQLServer 2005 SELECT d.name N'TableName', d.xtype N'TableType', a.colorder N'ColumnIndex', a.name N ...

  4. 导购效果跟踪: SPM

    什么是SPM SPM是淘宝社区电商业务(xTao)为外部合作伙伴(外站)提供的一套跟踪引导成交效果数据的解决方案. 下面是一个跟踪点击到宝贝详情页的引导成交效果数据的SPM示例: http://det ...

  5. scrapy爬虫框架入门教程

    scrapy安装请参考:安装指南. 我们将使用开放目录项目(dmoz)作为抓取的例子. 这篇入门教程将引导你完成如下任务: 创建一个新的Scrapy项目 定义提取的Item 写一个Spider用来爬行 ...

  6. Oracle 查看相关优化器参数

    select x.ksppinm name, y.ksppstvl value, y.ksppstdf isdefault, decode(bitand(y.ksppstvf, 7), 1, 'MOD ...

  7. Oracle 手动收集统计信息

    收集oracle统计信息 优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN: 列统计: --列中唯一值的数量(NDV ...

  8. python-抓取图片

    今天看到博客园一个文章,python抓取图片,也没看内容,心想自己也写一个抓取脚本试试看,一方面自己也在学习python,另一方面毕竟实际工作也经常会遇到这种需要临时写脚本的时候,突击锻炼还是好的嘛. ...

  9. 关于消除超长的case列表的一个思路

    最近项目里面涉及和低层通信的一个模块,因为需要定义通信协议,然后一大堆指令,定义一个枚举的话就能看到几十上百的数据项,匹配操作的时候,那么问题来了,尼玛,这么多的case看着就头晕,就有了一个想法:怎 ...

  10. kettle过滤、生成随机数、改变开始复制数量

    下面是一个用Kettle实现数据过滤.生成随机数.改变开始复制数量的连贯示意图. 首先,我们将控件一一建立,通过hop建立连接 下面对每一个控件进行设置 1.生成随机数控件(随机取一个数字与字符串) ...