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

七、缓存应用

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

(一)处理步骤

  1、接收。可同时从多条输入连接上读取,在整条报文抵达之前开始事务处理。

  2、解析报文,提取出URL和各种首部,放入易于操作的数据结构。

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

  4、新鲜度检测,不够新鲜就重新请求

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

  6、发送

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

(二)新鲜度检测  

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

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

  2、  再验证

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

  3、  再验证条件方法

    在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中的缓存文件:

 

posted @ 2018-02-23 15:20  最是少年时  阅读(294)  评论(0)    收藏  举报