从输入url到页面(三):缓存机制

7、缓存应用

  Web缓存是能够自动保存厂家文档副本的HTTP设备。能够分为私有专用缓存,和共有共享缓存。web浏览器中有内建的私有缓存,存在我的电脑的磁盘和内存中。共有缓存是代理缓存服务器,结构有层级结构,和更复杂的网状结构。网状结构须要结合内容路由器,来动态决策缓存通讯的管理。web

(一)处理步骤

  一、接收。可同时从多条输入链接上读取,在整条报文抵达以前开始事务处理。算法

  二、解析报文,提取出URL和各类首部,放入易于操做的数据结构。浏览器

  三、查询,是否有本地副本可用,若没有就请求获取一份副本并保存。缓存

  四、新鲜度检测,不够新鲜就从新请求服务器

  五、建立响应,用新的首部和缓存的实体。不用调整Date首部,表示的是原始服务器最初产生这个对象的日期。数据结构

  六、发送spa

  七、日志。更新缓存命中与未命中的统计数据。代理

(二)新鲜度检测  

  一、  HTTP/1.0+:Expires 指定一个绝对的过时日期日志

    HTTP/1.1: Cache-Control:max-age=10000 以秒为单位,从文档生成到再也不新鲜的时间。对象

  二、  再验证

    对于过时的缓存,向服务器请求在验证,若发生变化获取新文档替换;没有变化,更新首部及有效期。

  三、  再验证条件方法

    在GET请求中添加特殊的条件首部,到条件为真时,服务器才会返回对象。

    If-Modified-Since:<cached last-modified date>:

    被称为IMS请求,在缓存资源的生成或修改日期以后发生变化的时候,服务器才会返回新资源200 OK。如条件为假,返回304 Not Modified响应报文。与Last-Modified响应首部配合工做。

    注:有些服务器,只是将IMS日期与最后修改日期作字符串匹配。

    If-None-Match:<Etag> 实体标签再验证

    有些状况下仅适用最后修改日期进行再验证是不够的:

    --周期性重写的文档,如后台程序写入,实际内容不变。

    --有些所作修改并不重要

    --没法准确判断页面的最后修改日期

    --文档在亚秒间隙发生变化

    Etag 实体标签是 附加到文档上的任意标签(引用字符串),可能包含了文档的序列号,文档内容的校验或其余指纹信息。

 

    当服务器响应回送了一个Etag时,HTTP/1.1 客户端必须使用实体标签验证器。

    若是只回送了一个Last-Modified值时,客户端会使用If-Modified-Since验证。

    二者都提供了,客户端应该使用者两种再验证方案。

    缓存或服务器若收到两种验证的首部是,只有都知足时,才能返回304。

(三)控制缓存 

  对缓存控制的方式优先级:

  --Cache-Control : no-store ,禁止缓存对响应进行复制保存。

  --Cache-Control : no-cache ,在使用缓存的文档前,必须与原始服务器进行新鲜度再验证。

  --Cache-Control : must-revalidate , 严格遵照过时时间,对陈旧副本就行再验证

  --Cache-Control : max-age , 从服务器将文档传来之时起,新鲜的时间

  --Expires 指定的是过时的绝对时间,应用程序时钟不一样步时有缺陷

  --试探性过时  缓存能够使用任意算法计算出一个最大使用期,大于24小时应该在响应首部添加警告。

  --新鲜度控制: 浏览器会有Refresh和Reload两种操做。

  Cache-Control : max-stale = <s> 缓存能够随意提供过时的文件,如指定了参数时间s,在这段时间内,文档就不能过时,文档过时时间不超过s,Expires + maxStale < nowDate

  Cache-Control : min-fresh=<s> 在将来S秒内文档要是新鲜的 Expires – minFresh < nowDate

  Cache-Control : only-if-cached 只有当缓存有副本时

(四)浏览器缓存

创建一个缓存池,内核从资源池中查找资源的关键字是URL。Webkit中对于不少资源,使用前是要想服务器发送再验证请求的。下图为查看Chrome中的缓存文件:

相关文章
相关标签/搜索