《HTTP权威指南》读书笔记:缓存

缓存的定义

Web缓存是可以自动保存常见文档副本的HTTP设备(包括浏览器?)

缓存的作用

  1. 减少冗余数据传输
  2. 缓解带宽瓶颈(很多网络为本地网络客户端提供的带宽比为远程服务器提供的带宽要宽)
  3. 缓解瞬时拥塞(不会所有的请求都奔着一台服务器去)
  4. 降低距离时延(就近访问么)

命中、非命中

  1. 命中率:请求命中缓存的比例
  2. 字节命中率:请求命中缓存的文档,其文档大小总和,占所有请求大小总和的比例(一些大文档尽管访问少,但对流量贡献大,对于按流量计费的人来说很重要)

客户端如何判断请求是否命中缓存:它能够过Date首部,如果Date的值比当前日期值要早,那么可以认为是缓存的响应。

如何保持副本的新鲜

HTTP通过以下两种机制来实现这样的目的:不要求服务器记住哪些缓存拥有资源副本,同时保持已缓存数据与服务器数据之间的一致。

1. 文档过期(document expiration)—— Cache-Control、Expires
2. 服务器再验证(server revalidation)—— If-Modified-Since(时间)、If-None-Match(结合ETag)

文档过期:相关的header

Expires

HTTP 1.0引入,指定实际的过期时间,而不是秒数。不推荐使用,原因:很多服务器的始终不同步或不正确。使用举例:

Expires: Fri, 05 Jul 2002, 05:00:00 GMT

Cache-Control: max-age

从服务器将资源传送过来时算起,文档处于新鲜的时间(单位为秒)。可通过将其设为0,来请求缓存(服务器)不要缓存资源。举例:

Cache-Control: max-age=0

Cache-Control: no-cache

名字比较有歧义,实际表达的意思是:缓存(服务器)在与原始服务器进行新鲜度再验证前,不能将资源提供给客户端使用。这里包含两个点:

  1. 标识为no-cache的响应实际是可以存储在本地缓冲区的
  2. 必须每次与原始服务器再校验

举例:

Cache-Control: no-cache

Cache-Control: no-store

带有no-store的响应,会禁止缓存对资源进行复制。缓存向客户端转发no-store响应后,会将副本删除。

Cache-Control: must-revalidate

可以使用陈旧(过期)的资源以提高性能。但在没有与原始服务器进行再验证的情况下,不能使用资源的陈旧副本。

no-cache的区别:

  1. no-cache:无论资源副本是否过期,都必须与原始服务器进行校验
  2. must-revalidate:资源副本过期前,无需校验;过期后,须校验,如原始服务器上的资源没变化,那么缓存可以提供陈旧的副本。(减少资源传输)

服务器再验证

If-Modified-Since(IMS)

询问服务器,资源在If-Modified-Since指定的时间之后,是否被修改了,如果

  1. 没被修改:返回304 Not Modified响应报文,同时只会发送需要在源端更新的首部,比如新的过期时间。
  2. 被修改了:携带新首部的资源会被返回给缓存,包括新的过期时间。

例子:

If-Modified-Since: Sat, 29 Jun 2002, 14:30:00 GMT

If-None-Match

ETag:实体标签(Entity Tag)。ETag再验证的原因:

  1. 有些文档会被周期性地重写,但实际包含的数据常常是一样的,但修改时间已经发生变化。
  2. 文档被修改了,但修改并不重要,不需要让所有缓存都失效。
  3. 某些服务器无法准确判断资源的最后修改时间。

流程与If-Modified-Since差不多,带上ETag去服务器查询,如果

  1. ETag发生变化:返回带有新ETag的资源
  2. ETag没变化:返回304 Not Modified

例子:

If-None-Match: "v2.6
If-None-Match: "v2.6","v2.7"(告诉服务器,带有这些实体标签的副本缓存上已有了)

 

时间: 2024-09-28 10:26:14

《HTTP权威指南》读书笔记:缓存的相关文章

javascript权威指南 学习笔记之javascript数据类型_javascript技巧

复制代码 代码如下: <!doctype html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>javascript数据类型</title> </head> <body> <script type="text/javasc

javascript权威指南 学习笔记之变量作用域分享_javascript技巧

不知道,大家对语言中变量的"声明"与"定义"是怎么理解的, 我的理解如下: "声明"变量,只是仅仅声明,而"定义"变量,指声明了,并且赋值了. 例如: 复制代码 代码如下: var name;//只是声明 var num = 11;//声明,并且赋值,即定义了 var password = "yangjiang";//声明,并且赋值,即定义了 下面是几点总结: 变量的作用域:全局的和局部的.(注意:如果尝试

perl脚本学习指南--读书笔记_应用技巧

undef 默认未定义字符,perl里面没有NULL,defined($x)函数:如果参数为undef返回false qw(cs phy geo) 类似于 ("cs", "phy", "geo")列表可以赋值给数组@array 数组操作符:pop,push操作末尾,shift,unshift操作开头,reverse逆序,@array = sort @array; foreach @array{print $_;}打印数组:$_是一个很强大的默认变

javascript权威指南 学习笔记之null和undefined_jquery

复制代码 代码如下: <!doctype html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>javascript之null和undefined</title> </head> <body> <script type="

将样式表放在顶部——高性能网站建设指南规则5(读书笔记)

PS:以下内容仅仅为个人读书笔记,如有错漏,随时欢迎指正.同时希望能有更多的前端爱好者们共同分享你们的心得! 背景 阅读<高性能网站建设指南>第五章,文章中, 作者建议最好将CSS文件(样式表)放在文档顶部,即<head>标签之间.当然这是在一定的应用前提之下的--该样式表在页面呈现时可能并 不需要,而是作用于由于用户与页面的交互行为而产生的动态标签.比方说你点击某个显示有"猛击我吧!!"的连接,然后页面弹出个DIV,用绿色字体和 24px的字号大小显示的标准国

Ansible权威指南.

Linux/Unix技术丛书 Ansible权威指南 李松涛 魏 巍 甘 捷 著 图书在版编目(CIP)数据 Ansible权威指南 / 李松涛,魏巍,甘捷著. -北京:机械工业出版社,2016.11 (Linux/Unix技术丛书) ISBN 978-7-111-55329-8 I. A- II. ①李- ②魏- ③甘- III. 程序开发工具-指南 IV. TP311.561-62 中国版本图书馆CIP数据核字(2016)第258615号 Ansible权威指南 出版发行:机械工业出版社(北

《ELK Stack权威指南 》第2章 插件配置

本节书摘来自华章出版社<ELK Stack权威指南 >一书中的第1章,第2节,作者饶琛琳,更多章节内容可以访问"华章计算机"公众号查看. 插 件 配 置 插件是Logstash最大的特色.各种不同的插件源源不断地被创造出来,发布到社区中供大家使用.本章会按照插件的类别,对一般场景下的一些常用插件做详细的配置和用例介绍.本章介绍的插件包括:1)输入插件.基于shipper端场景,主要介绍STDIN.TCP.File等插件.2)编解码插件.编解码通常是会被遗忘的环节,但是运用好

《淘宝技术这十年》读书笔记 (三). 创造技术TFS和Tair

        前面两篇文章介绍了淘宝的发展历程和Java时代的变迁:             <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源             <淘宝技术这十年>读书笔记 (二).Java时代的脱胎换骨和坚若磐石         马云说过"创新不是为了与对手竞争,而是跟明天竞争",所以这篇文章讲述淘宝的创新技术TFS和Tair及创新的产品.         该篇文章不仅仅对在读大学生非常有所帮助,因为你能从文章中看到很多你需要学

《Netty 权威指南》—— 选择Netty的理由

声明:本文是<Netty 权威指南>的样章,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文. 在开始本节之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果2个多月过去了,他们的NIO服务端始终无法稳定,问题频出.由于NIO通信是它们的核心组件之一,因此,项目的进度受到了严重的影响,领导对此非常恼火.另一个项目组直接使用Netty作为NIO服务端,业务的定制开发工作量非常小,测试表明,功能和

《淘宝技术这十年》读书笔记 (四). 分布式时代和中间件

        前面两篇文章介绍了淘宝的发展历程.Java时代的变迁和淘宝开始创新技术:            <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源            <淘宝技术这十年>读书笔记 (二).Java时代的脱胎换骨和坚若磐石            <淘宝技术这十年>读书笔记 (三).创造技术TFS和Tair        这篇文章主要讲述分布式时代和中间件相关知识,包括服务化.HSF.Notify和TDDL.同时里面有我们经常遇见的编