缓存的处理步骤

=================摘自《HTTP权威指南》=====================

现代的商业化代理缓存相当的复杂。这些缓存构建的非常有效,可以支持HTTP和其他一些技术的各种高级特性,但除了一些微妙的细节外,web缓存的基本工作原理大多很简单。对一条HTTP GET报文的基本缓存处理过程包括7个步骤(图7-11)

1、  接收—缓存从网络中读取抵达的请求报文;

2、  解析—缓存对报文进行解析,提取出URL和各种首部;

3、  查询—缓存查看是否有本地缓存可用,如果没有,就获取一份副本(并将其保存在本地);

4、  新鲜度检测—缓存查看已缓存的副本是否足够新鲜,如果不是,就询问服务器是否有任何更新;

5、  创建响应—缓存会用新的首部和已缓存的主体来构建一条响应报文;

6、  发送—缓存通过网络将响应回送给客户端;

7、  日志—缓存可选地创建一个日志文件条目来描述这个事务;

1、  第一步—接收

缓存检测到一条连接上的活动,读取输入数据。高性能的缓存会同时从多条输入连接上读取数据,在整条报文抵达之前开始对事务进行处理。

2、  第二部—解析

缓存将请求报文解析为片段,将首部的各个部分放入易于操作的数据结构中。这样缓存软件更容易处理首部字段并修改它们了。

3、  第三步—查找

缓存获取了URL,查找本地副本。本地副本可能存储在内存、本地磁盘,甚至附近的另一台计算机中。专业级的缓存会使用快速算法来确定本地缓存中是否有某个对象。如果本地没有这个文档,它可以根据情形和配置,到原始服务器或父代理中去取,或者返回一条错误信息。

已缓存对象中包含了服务器响应主体和原始服务器的响应首部,这样就会在缓存命中时返回正确的服务器首部。已缓存对象还包含了一些元数据(metadata),用来记录对象在缓存中停留了多长时间,以及它被用过了多少次等。

4、  第四步—新鲜度检测

HTTP通过缓存将服务器文档的副本保留一段时间。在这段时间里,都认为这份文档是“新鲜的”,缓存可以在不联系服务器的情况下,直接提供该文档。但一旦已缓存的副本停留的时间过长,超过了文档的新鲜度限制(freshness limit),就认为文档“过时”了,在提供该文档前,缓存要再次与服务器确认,以查看文档是否发生了变化。客户端发送给缓存的所有请求首部自身都可以强制缓存进行再验证,或者完全避免验证,这使得事情变得更加复杂了。

HTTP有一组非常复杂的新鲜度检测规则,缓存产品支持的大量配置选项,以及与非HTTP新鲜度标准进行互通的需要则使问题变得更严重了。

5、  第五步—创建响应

我们希望缓存的响应看起来就像来自原始服务器一样,缓存将已缓存的服务器响应首部作为响应首部的起点。然后缓存就对这些基础首部进行了修改和扩充。

缓存负责对这些首部进行改造,以便与客户端的要求相匹配。比如,服务器返回的可能是一条HTTP 1.0响应(甚至是HTTP 0.9响应),而客户端期待的是一条HTTP 1.1响应,在这种情况下,缓存必须对首部进行响应的转换。缓存还会向其中插入新鲜度信息(Cache-control、Age以及Expires首部),而且通常会包含一个Via首部来说明请求是由一个代理缓存提供的。

注意:缓存不应该调整Date首部。Date首部表示的是原始服务器最初产生这个对象的日期。

6、  第六步—发送

一旦响应首部准备好了,缓存就将响应回送给客户端。和所有代理服务器一样,代理缓存要管理与客户端之间的连接。高性能的缓存会尽力高效的发送数据,通常可以避免在本地缓存和网络I/O缓冲区之间进行文档内容的复制。

7、  日志

大多数缓存都会保存日志文件以及与缓存的使用有关的一些统计数据。每个缓存事务结束之后,缓存都会更新缓存命中和未命中数目的统计数据(以及其他相关的度量值)并将条目插入一个用来显示请求类型、URL和所发生时间的日志文件。

8、  缓存处理流程图

图7-12以简化的形式显示了缓存是如何处理请求以获取一个方法为GET的URL的。

HTTP之缓存处理步骤的更多相关文章

  1. Hibernate4.1.4配置二级缓存EHCache步骤

    1.当然首先引入EHCache相关的jar包 这些包不需要另外下载,在Hibernate官方网站下载Hibernate4.1.7的压缩包(如:hibernate-release-4.1.7.Final ...

  2. [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. 使用gulp解决RequireJS项目前端缓存问题(一)

    1.前言 前端缓存一直是个令人头疼的问题,你有可能见过下面博客园首页的资源文件链接: 有没有发现文件名后面有一串不规则的东东,没错,这就是运用缓存机制,我们今天研究的就是这种东西. 先堵为快,猛戳链接 ...

  4. Hibernate ——二级缓存

    一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...

  5. [NHibernate]缓存(NHibernate.Caches)

    系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate ...

  6. MyBatis学习--查询缓存

    简介 以前在使用Hibernate的时候知道其有一级缓存和二级缓存,限制ORM框架的发展都是互相吸收其他框架的优点,在Hibernate中也有一级缓存和二级缓存,用于减轻数据压力,提高数据库性能. m ...

  7. hibernate的二级缓存

    缓存(Cache): 计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数 ...

  8. 深入了解Hibernate的缓存使用

    Hibernate缓存 缓存是计算机领域的概念,它介于应用程序和永久性数据存储源(如在硬盘上的文件或者数据库)之间,其作用是降低应用程序 直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中 ...

  9. NHibernate系列文章十:NHibernate对象二级缓存下

    摘要 上一节对NHibernate二级缓存做了简单介绍,NHibernate二级缓存是由SessionFactory管理的,所有Session共享.这一节介绍二级缓存其他两个方面:二级缓存查询和二级缓 ...

随机推荐

  1. SATA、PCIe、AHCI、NVMe

    IT 界总喜欢发明新名词.而且同一个东西,可能有几个不同的名字.同一个名字,又可能指不同的东西. 从物理接口角度来说,我们常见的有IDE(淘汰),SATA,PCIe,M.2(固态硬盘) M.2插槽是有 ...

  2. Python - MySQL 数据库连接 - PyMySQL 驱动 - 第二十五天

    序言 本文我们为大家介绍 Python3 使用 PyMySQL 连接数据库,并实现简单的增删改查. 什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务 ...

  3. python with语句与contextlib

    参考链接:https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/ with语句用于异常处理,适用于存在资源访问的场合,无论 ...

  4. Appium基于PO模型的自动化测试(Python)

    基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: #利用unittest并生成测试报告 class Appium_test(unitt ...

  5. ASCII,Unicode,UTF-8,GBK 区别

    编码历史与区别 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又 ...

  6. 微信小程序滚动tab的实现

    微信小程序滚动tab的实现 1.目的:为了解决滚动版本的tab,以及实现虹吸效果. 2.方案:自己动手写了一个Demo,用于测试实现如上的效果.其代码有做参考,在这里先声明.具体的参照如下:重庆大学二 ...

  7. 汇编指令之STOS、REP

    版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明.23:28:13,23:28:19作者By-----溺心与沉浮----博客园 STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的 ...

  8. RDD算子的使用

    TransformationDemo.scala import org.apache.spark.{HashPartitioner, SparkConf, SparkContext} import s ...

  9. mybatis中的分页插件

    1.Mybatis的分页plugin实现原理 2.具体步骤 第一步.导入到pom.xml文件中依赖包 第二步.配置插件(必需) 在mybatisConfig.xml文件中配置以下代码 代码位置:在en ...

  10. 服务器Oracle数据库配置与客户端访问数据库的一系列必要设置

    tips:所有路径请对应好自己电脑的具体文件路径. 一.服务器及Oracle数据库设置 1.刚装完的Oracle数据库中只有一个dba账户,首先需要创建一个用户. 2.配置监听,C:\app\Admi ...