文档章节

《HTTP权威指南》– 7.缓存

dfatxm
 dfatxm
发布于 2016/12/06 11:23
字数 1614
阅读 3
收藏 0
点赞 0
评论 0

使用缓存的优点:

  1. 减少了数据的数据传输,节省了网络费用;
  2. 缓解了网络瓶颈的问题,不需要更多的带宽就能更快地加载页面;
  3. 降低了原始服务器的要求,服务器可以更快地响应、避免过载出现;
  4. 降低了距离时延,因为比较远的地方加载页面会慢一些;

HTTP为我们提供了几个用来对已缓存对象再验证的工具,但最常用的是 IF-Modified-Since首部。将这个首部添加到 GET 请求中去,就可以通知服务器:只有在缓存了对象的副本之后,又对其进行了修改的情况下,才发送此对象。

服务器对象未被修改: 服务器向客户端发送一个小的 HTTP 304 Not Modified 响应;
服务器对象与已缓存对象不同: 服务器向客户端发送一条普通的、带有完整内容的 HTTP 200OK 响应;
服务器对象不存在: 服务器回送一个 404 Not Found 响应,缓存将其副本删除;

HTTP没有为用户提供一种手段来区分响应是缓存命中的还是访问原始服务器得到的。在这两种情况下,响应码都是 200 OK

客户端 有一种方法可以判断相应是否来自缓存,就是使用 Date首部。将响应中Date首部的值与当前时间进行比较,如果响应中的日期值比较早,客户端通常就可以认为这是一条缓存的响应。

缓存的拓扑结构:

缓存可是单个用户专用的,也可以是若干名用户共享的。专用缓存被称为 私有缓存 (个人缓存,包含了单个用户最常用的页面),共享的缓存被成为 公有缓存(包含了某个用户团体的常用页面)。

缓存的处理步骤:

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

文档过期:

通过特殊的 HTTP Cache-Control 首部 和 Expires 首部, HTTP 让原始服务器向每个文档附加了一个 过期时间。在缓存文档过期之前,缓存可任意频率使用这些副本,而无需与服务器联系,当然,除非客户端请求中包含有阻止提供已缓存或未验证资源的首部。

如果文档过期了,并不意味着它和原始服务器上目前处于活跃状态有实际的区别,仅仅意味着到了要进行核对时间了,这种情况被为 服务器再验证,说明缓存需要询问原始服务器文档是否发生了变化。如果文档发生了变化,缓存会获取一份新的文档副本,并将其存储在旧文档的位置上,然后将文档发送给客户端。如果文档没有发生变化,缓存只需要获取新的首部,包括一个新的过期日期,并对缓存中的首部进行更新即可。

HTTP协议缓存要求

HTTP协议要求行为正确的缓存返回下列内容之一:

  1. 足够新鲜的 已缓存副本;
  2. 与服务器进行过再验证,确认其仍然新鲜的已缓存副本;
  3. 如果需要与之进行再验证的原始服务器出现了故障,就返回一条错误报文;
  4. 附有警告信息说明内容可能不正确的已缓存对象;
实体标签再验证: If – None – Match

实体标签 是附加到文档上的任意标签。它们可能包含了文档的序列号或版本号,或者是文档内容的校验及其他信息。当发布者对文档进行了修改时,可以修改文档的实体标签来说明这个新的版本。这样如果实体标签被修改了,缓存就可以用 If – None – Mach 条件首部来 GET 文档的新副本了。实体标签和修改日期都是 缓存验证器

控制缓存:

服务器可以通过 HTTP 定义的几种方式来指定在文档过期之前可以将其缓存多长时间,按照优先级顺序:

可以将以下首部信息附加到响应中:

1. Cache – Control :no-store
禁止缓存对响应进行复制。缓存通常会向非缓存代理服务器一样,向客户端转发一条no-store响应,然后删除对象

2.Cache – Control :no-cache
标识为no-cache的响应实际上是可以存储在本地缓存区中的,只是在原始服务器进行新鲜度再验证之前,缓存不能将其提供给客户端使用

3.Cache – Control :must-revalidate

4.Cache – Control :max-age 
表示从服务器将文档传来之时起,文档的新鲜状态剩余秒数,服务器可以将 Cache–Control:max-age 设置为0,从而在每次访问的时候都进行刷新

5.Cache – Control :Expires
不附加过期信息,让缓存确定自己的过期日期。

通过 HTTP-EQUIV 控制HTML缓存:

将HTML文档设置为非缓存的:

<META HTTP-EQUIV = "cache-control"  Content = "no -cache" >

<META HTTP-EQUIV > 标签并不是控制文档缓存特性的好方法。因为支持 HTTP-EQUIV 标签 的HTML浏览器使用的 Cache-Control 规则可能会与拦截代理缓存所使用的规则有所不同,这样就会使缓存的过期处理行为发生混乱。所以由经过正确配置的服务器发送
的 HTTP首部 来交流对文档的缓存控制请求是唯一可靠的办法。

© 著作权归作者所有

共有 人打赏支持
dfatxm
粉丝 3
博文 66
码字总数 20630
作品 0
厦门
前端工程师
A Year Of Books - 2016 Javaer书单

A Year Of Books – 2016 Javaer书单 (PS:欢迎留言推荐,很多来自白衣大哥的推荐) 1. OS & Networking 《编码 : 隐匿在计算机软硬件背后的语言》 《Linux内核设计与实现 第3版》 《WireShark...

泥沙砖瓦浆木匠 ⋅ 2016/04/25 ⋅ 2

javascript——从「最被误解的语言」到「最流行的语言」

JavaScript曾是“世界上最被误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax的到来,JavaScript“从最受误解的编程语言演变为最流行的语言”,这除了幸运之外,...

modernizr ⋅ 2014/05/20 ⋅ 12

《Istio官方文档》Pilot

《Istio官方文档》Pilot 并发编程网 – ifeve.com2018-01-080 阅读 JAVAservice 原文链接 译者:carvendy Pilot(领航员) Pilot负责Envoy实例在Istio网格服务部署的生命周期。 在上图中的图形,...

并发编程网 – ifeve.com ⋅ 01/08 ⋅ 0

HTTP缓存技术,304(Not Modified)和200(from cache)有何区别?

想请教一下http服务器的缓存技术,也看过《http权威指南》这本书,了解过一些缓存头。 目前我的疑问就是在实际环境中配置http headers的时候,发现浏览器有的返回的是304(Not Modified),有的...

Feng_Yu ⋅ 2014/10/18 ⋅ 5

《Istio官方文档》Pilot

原文链接  译者:carvendy Pilot(领航员)   Pilot负责Envoy实例在Istio网格服务部署的生命周期。   在上图中的图形,Pilot在服务网格中有着权威的服务代表,而服务网格依赖着底层平台。...

魔术师Carvendy ⋅ 01/08 ⋅ 0

分享28本关于HTML5的学习书籍(免费下载)

分享28本关于HTML5的学习书籍(免费下载) 1、用HTML5新特性开发移动App 2、用HTML5CSS3实现媲美原生应用的交互体验 3、改善HTML5网页性能-译 4、WEBHTML5在LBS社区中的应用 5、WebQQ3.0:让...

邓剑彬 ⋅ 2012/11/30 ⋅ 6

前端工程师必备技能汇总

本文来源:https://github.com/JacksonTian/fks 项目起源 还记得@jayli 的这幅前端知识结构图么。 图片的形式具有诸多的不便。缺失源图的我们,无法为此图贡献些什么,随着时间的迁移,或许有...

oschina ⋅ 2014/04/11 ⋅ 108

HTTP/1.1的实体首部

文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 HTTP实体首部描述了HTTP报文的内容。HTTP/1.1定义了以下10个实体首部字段: Content-Type 实体中所承载的对象的类型。 Content-Length 所...

Quincuntial ⋅ 2017/01/03 ⋅ 0

读书《HTTP权威指南》

读书《HTTP权威指南》 第1 章 HTTP 概述 1.1 HTTP——因特网的多媒体信使 1.2 Web 客户端和服务器 1.3 资源 1.3.1 媒体类型 MIME 类型是一种文本标记,表示一种主要的对象类型和一个特定...

壶漏子 ⋅ 2015/05/05 ⋅ 6

分享26本关于Jquery的学习书籍(免费下载)

分享26本关于Jquery的学习书籍(免费下载) 1、精通JavaScript+jQuery 2、网友small6分享锋利的jQuery实例源码 3、网友small6分享jQuery权威指南配套源代码 4、犀利开发jQuery内核详解与实践...

邓剑彬 ⋅ 2012/11/30 ⋅ 8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Boot整合模板引擎thymeleaf

项目结构 引入依赖pom.xml <!-- 引入 thymeleaf 模板依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId......

yysue ⋅ 12分钟前 ⋅ 0

ConstraintLayout使用解析

AndroidStudio3.0创建Project默认的布局就是ConstraintLayout。 AndroidStudio3.0前的可以自己修改,使用ConstraintLayout。 为了要使用ConstraintLayout,我们需要在app/build.gradle文件中...

_OUTMAN_ ⋅ 23分钟前 ⋅ 0

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 57分钟前 ⋅ 9

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 今天 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部