HTTP权威指南----缓存

缓存的处理步骤:

1、接收----缓存从网络中读取抵达的请求报文
2、解析----缓存对报文进行解析,提取出URL和各种首部
3、查询----缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存在本地)
4、新鲜度检测----缓存查看已缓存的副本是否足够新鲜,如果不是,就询问原始服务器是否有任何更新
5、创建响应----缓存会用新的首部和已缓存的主体来构建一条响应报文
6、发送----缓存通过网络将响应发回给客户端
7、日志----缓存可选的创建一个日志文件条目来描述这个业务

注意:1、HTTP响应报文的首部字段中,用Cache-Control、Age、Expires等首部表示新鲜度信息相关内容,通过via首部表示实体内容由该代理缓存提供。

2、缓存不应该调整Date首部,Date首部表示的是原始服务器最初产生这个对象的日期,这样可以在客户端中看出资源产生的最初日期。

以用Google explorer访问www.sina.com.cn为例:报文截图如下:

                     

这里注意到一点:Date字段说明是2016.9.30 8:54在Nginx服务器上缓存获取的,而我请求的时间也有截图,为下午5:01分,X-Cache应该为Server端自定义的扩展首部,说明了缓存服务器的名字。
expires字段指绝对过期时间,应该很好理解,而Cache-control字段的max-age=60指相对过期时间,单位为秒,即60秒。
以上说明,新浪网信息的更新时间应该在早上9点左右。之后就是到了要核对的时间了,我们每次请求,缓存服务器都应该去原始服务器去核对信息,看这份文档是否发生了变化,进行“服务器再验证”。截图中很明显,文档已经过期,但是原始服务器对文档并没有做出改动(应该返回304 not modified),可是缓存服务器为什么没有修改过期时间呢? 根据书中所提,缓存服务器验证之后应该对expires首部进行更新的,可是这里没有。(why?)

这里再说一下关于验证的:关于验证有两种方式:
1、通过首部If-Modified-Since:<Date>再验证
Date为截图中Last-modified指定的日期,如果没有被修改,应该返回304 not modified
2、通过首部If-None-Match:<ETag>再验证
ETag为实体的版本信息或者为“指纹信息”,如果没有被修改,应该返回304 not modified,如果被修改会返回200 OK,并且附加新的ETag。(实体标签再验证是为了弥补当服务器提供的文档的修改发生在亚秒级的情况的不足,以秒为单位不够用)

书中指出,HTTP/1.1中的应用程序都应该使用Cache-Control:no-cache,表明每次缓存服务器都应该与原始服务器进行再验证。(可是实际并不是这样,试了大部分网站,如新浪、搜狐网、百度网、csdn、博客园、斗鱼、全民,只有斗鱼和全民两个直播网站没有指出Cache-control,其他指出的值都为max-age)

控制缓存的优先级递减顺序:
Cache-Control:no-store  --->    no-cache    --->   must-revalidate   ---> max-age  ---> expires:<date>    ---->  不附加缓存过期信息,让缓存确定自己的过期日期。

下面是一个容易记住的大致的缓存GET请求流程图:

时间: 2024-10-07 06:55:10

HTTP权威指南----缓存的相关文章

JavaScript权威指南 - 函数

函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对于其他面向对象语言,在JavaScript中的函数是特殊的,函数即是对象.JavaScript可以把函数赋值给变量,或者作为参数传递给其他函数,甚至可以给它们设置属性等. JavaScript的函数可以嵌套在其他函数中定义,这样定义的函数就可以访问它们外层函数中的任何变量.这也就是所谓的"闭包&qu

HTML5与CSS3权威指南.pdf6

第11章 获取地理位置信息 HTML5为window.navigator对象新增了一个geolocation属性 取得当前地理位置 void getCurrentPosition(onSuccess,onError,options); 第一个参数为获取成功执行的回调函数,第二个为失败时执行的回调函数,第三个为一些可选属性的列表(第二个和第三个可选) navigator.geolocation.getCurrentPosition(function(position){ //获取成功时的处理(参数

《JavaScript权威指南》学习笔记之二十---XMLHttpRequest和AJAX解决方案

一.AJAX概述 AJAX是Asynchronous JavaScript and XML的缩写,中文译作异步JavaScript和XML.AJAX 不是新的编程语言,而是一种使用现有标准的新方法,在不重新加载页面的情况下,与服务器交换数据并更新部分网页的艺术.其核心是:客户端的Javascript能够与web服务器进行异步数据交换. 二.AJAX基础---XMLHttpRequest对象 所有现代浏览器(IE7+.Firefox.Chrome.Safari 以及 Opera)均内建 XMLHt

Hadoop权威指南读书笔记

本书中提到的Hadoop项目简述 Common:一组分布式文件系统和通用I/O的组件与接口(序列化.javaRPC和持久化数据结构). Avro:一种支持高效.跨语言的RPC以及永久存储数据的序列化系统. MapReduce:分布式数据处理模型和执行环境,运行于大型商业集群. HDFS:分布式文件系统,运行于大型商用机集群. Pig:一种数据流语言和运行环境,用以检索非常大的数据集.Pig运行在MapReduce和HDFS的集群上. Hive:一个分布式.按列存储的数据仓库.Hive管理HDFS

《HTTP权威指南》学习总结1——HTTP协议概述

备注:本文最初是针对我在github pages上搭建的博客写的,很多样式都是自己定制的,所以看起来效果可能不是很好,想获得更佳的阅读体验可以移步我的博客. 引言 本来是计划要翻译HTTP相关rfc文档的,奈何工程量巨大,进度实在太慢,只能放弃,以后有兴趣可以搞一下,因为里面确实有一些很有用的东西,当前学习任务还是讲究效率的.终于在一些因素的影响下,我决定在1个月内看完<HTTP权威指南>这本书.从3月13日开始到4月15日,进度还是拖下了,因为游戏太好玩了. 不说废话,进入正题. 如今我们已

HTML5与CSS3权威指南.pdf1

第2章 HTML5与HTML4的区别 HTML5的文件扩展符与内容类型保持不变仍为“.html”或“.htm”,内容类型(ContentType)仍为“text/html” DOCTYPE声明: HTML4中,<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> HT

HTML5与CSS3权威指南.pdf4

拖放API HTML5实现了直接拖放操作API,简化HTML4利用mousedown.mousemove等事件实现的操作 实现拖放的步骤 1要将被拖动元素的draggable属性设置为true,img元素与a元素(必须指定href)默认允许拖放 2编写有关拖放的事件处理代码 DataTransfer对象的属性与方法 设定拖放时的视觉效果 dropEffect属性(目标元素)与effectAllowed属性(源元素)结合起来可以设定拖放时的视觉效果, 1如果effectAllowed属性设定为no

【Android实战】----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的

一.简介 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明白为什么Retrofit那么屌.最近也看了一些其源码分析的文章以及亲自查看了源码,发现其对Java网络编程及HTTP权威指南有了一个很好的诠释.一直以来,都信奉一个原则,在这个新技术日新月异的时代,如何在Java界立足,凭借的就两点: 1.基本功,包括:Java基本知识,(Java编程思想.Effective Java),Java进阶(Java虚拟机.Java设计模式).网络相关(这个时

Struts2权威指南笔记

1.mvc特点包括: ① 多个视图可以对应一个模型 ② 模型返回的数据与显示逻辑分离 ③ 应用层被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性 ④ 控制层的概念也很有效,由于它把不通的模型和不同的视图组合在一起,完成不同的请求 ⑤ Mvc更符合软件工程化管理的精神 2.Struts2框架的大致处理流程: ① 浏览器发送请求,如请求/mypage.action ② 核心控制器FilterDispatcher根据请求决定调用合适的Action ③ Webwork的拦截器链自动对请求应用通用