作者简介

李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷。喜欢钻研底层技术,认为底层基础才是王道。一切新技术都离不开操作系统(CPU、内存、磁盘)、网络等。坚持输入输出,记录自己学习的点滴,在平凡中坚持前行,总有一天会遇见不一样的自己。公众号:运维汪(ID:Leeeee_Li)。
                                                                 
                                                                                   
 

一、缓存的优点

1、减少冗余数据传输
当很多客户端访问一个服务器时,服务器会多次传输一份文档每次传送给一个客户端。一些相同的字节会在网络中一遍遍的传输,这些冗余的数据传输会耗尽网络带宽,降低传输速度,加种Web服务器的负载。有了缓存,就可以保留第一条服务器响应的副本,后续请求就可以由缓存的副本来响应。
 
2、缓解网络瓶颈
缓存可以缓解网络的瓶颈。很多网络为本地网络客户端提供的带宽比远程服务器提供的带宽要宽。客户端会以路径上最慢的网速访问服务器。如果客户端从一个快速局域网的缓存中得到了一个副本,那么缓存就可以提高性能,尤其在传输的文件比较大时。
 
3、瞬间拥塞
缓存在破坏瞬间拥塞时起到重要的作用。
 
4、距离时延
当带宽不成问题的情况下,每台路由器会增加因特网流量的时延。
 

二、缓存命中

1、缓存命中  
 
已有的副本为某些到达缓存的请求提供服务,称为缓存命中(cache hit)
 

2、缓存未命中
 
一些到达缓存的请求可能会由于没有副本可用,而被转发到原始服务器,称为缓存未命中(cache miss)
 

3、HTTP再验证
 
原始服务器的内容可能会发生变化,缓存要对其进行检测,看他们保存的副本是否仍然是服务器上最新的副本,这种新鲜度检测被称为HTTP再验证。
 
3.1、再验证命中
 
缓存对缓存的副本进行再验证时,会向原始服务器发送一个小的再认证请求。如果内容没有变化,服务器返回304 Not Modified。这种认证称为再验证命中(revalidate hit)或缓慢命中(slow hit)
 

3.2、再验证未命中
 
如果服务器对象已与缓存副本不同,服务器返回200 OK
 

3.3 对象被删除
 
如果服务器对象已经被删除了,服务器就返回404 Not Found响应,缓存也会将其副本删除。
 
4、缓存命中率
 
缓存提供服务的请求所占的比例称为缓存命中率(cache hit rate),也称文档命中率(document hit rate)。
 
5、字节命中率
 
字节命中率表示的是缓存提供的字节在传输的所有字节中所占的比例。
 
 

三、缓存的处理步骤

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

四、标记

1、过期响应首部
 
Cache-Control: max-stale 缓存可以随意提供过期的文件
Cache-Control: max-stale=<s> 在<s>秒时间内,文档就不能过期
Cache-Control: min-fresh=<s> 至少在为了<s>秒内文档要保持新鲜
Cache-Control: max-age 资源能够被缓存(保持新鲜)的最大时间,max-age是距离请求发起的时间的秒数
Cache-Control:no-cache 每次由请求发出时,缓存会将此请求发送到服务器进行再认证,如果没有过期,缓存才使用本地的缓存副本返回
Cache-Control:no-store 缓存中不得存储任何关于客户端和服务端响应的内容,每次由客户端发起的请求都会下载完整的响应内容
Expires 指定一个绝对的过期日期,如果过期日期已经过了,就说明文档不再新鲜了。如Wed, 06 Jan 2021 09:35:39 GMT
 
在缓存文档过期前,缓存可以任意频率使用这些副本,无需与服务器联系(特殊情况除外)。一旦已缓存文档过期,缓存就必须与服务器进行核对,询问文档是否被修改过,如果被修改过,就要获取一份新的(带有新的过期日期)的副本。
 
2、条件方法再验证
 
If-Modified-Since: <date> 如果从指定日期之后文档被修改过了,就执行请求的方法。可以与Last-Modifed服务器响应首部配合使用,只有在内容被修改后与已缓存版本有所不同的时候采取获取内容。
If-None-Match:<tags> 服务器可以为文档提供特殊的标签(ETag),而不是将其与最近修改的日期相匹配。这些标签就像序列号一样。如果已缓存标签与服务器文档中的标签不一样。If-None-Match首部就会执行所请求的方法。
 

五、学习交流

欢迎大家关注我的公众号,一起交流、学习。

 

图解HTTP权威指南(五) | HTTP缓存的更多相关文章

  1. 图解HTTP权威指南(四)| 代理

    作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络等. ...

  2. 图解HTTP权威指南 | HTTP报文

                                                                                    一.问题 1.报文流是如何流动的 2.H ...

  3. 图解HTTP权威指南(二)| 连接管理

    一.两个问题 1.HTTP是如何使用TCP连接的 2.HTTP的连接,并行连接.keep-alive(持久连接)和管道化连接   二.TCP连接 1.什么是TCP   TCP/IP是全球计算机及网络设 ...

  4. 图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应

    作者简介   李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络 ...

  5. maven权威指南学习笔记(五)—— POM

    1. 简介 Archetype插件通过 pom.xml 文件创建了一个项目.这就是项目对象模型 (POM),一个项目的声明性描述. 当Maven运行一个目标的时候,每个目标都会访问定 义在项目POM里 ...

  6. maven POM —— maven权威指南学习笔记(五)

    1. 简介 Archetype插件通过 pom.xml 文件创建了一个项目.这就是项目对象模型 (POM),一个项目的声明性描述. 当Maven运行一个目标的时候,每个目标都会访问定 义在项目POM里 ...

  7. 《Kafka权威指南》读书笔记-操作系统调优篇

    <Kafka权威指南>读书笔记-操作系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大部分Linux发行版默认的内核调优参数配置已经能够满足大多数应用程序的运 ...

  8. Http权威指南学习研究

    学习时间:                                   该学习:第六章  6.6小节   加油   185页 2017年5月15日15:13:00 今天任务: 看完前两章节: ...

  9. (6)《Head First HTML与CSS》学习笔记---结尾、《HTML5权威指南》读书笔记

    1.内联元素的外边距.内边距与块元素稍有不同. 如果一个内联元素四周都增加外边距,只能看到左边和右边会增加空间:你也可以对内联元素的上下增加内边距,不过这个内边距不会影响包围它的其他内联元素的间距—— ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:QMainWindow的tabifyDockWidget方法将QDockWidget两个停靠窗选项卡式排列

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 主窗口的tabifyDockWidget方法用于将主窗口的两个停靠窗口 ...

  2. 第十一章 Python 支撑正则表达式处理的re模块

    re模块是Python中支持正则表达式处理的模块,老猿学了之后,发现这部分内容太多,要表述清楚需要开单章才能写清楚,但老猿觉得re模块的使用对多数人来说要通过教程学习去熟练掌握很难,需要经常接触练习加 ...

  3. Scrum 冲刺 第五篇

    Scrum 冲刺 第五篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 初步完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成后台首页模块数据库的接口 钟俊豪 ...

  4. MySQL日期和时间函数汇总

    本文基于MySQL8.0 本文介绍MySQL关于日期和时间操作的函数. 日期和时间函数 函数 描述 ADDDATE() 给日期值添加时间值 ADDTIME() 添加time CONVERT_TZ() ...

  5. 基于Dokcer搭建Redis集群搭建(主从集群)

    最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得之前写的这篇 <基于Docker的Redis集群搭建> 文章一定是有问题了,所以我花了几分钟浏览之前的文章总结了下面几 ...

  6. linux修改文件所属的用户组以及用户

    linux修改文件所属的用户组以及用户 将文件夹从A用户(huangxf)目录复制B用户(zhenglf)目录,其中B没有sudo权限.将A的Downloads文件夹下的所有文件,复制到B的Docum ...

  7. Java8的Lambda表达式,你会不?

    目录 理解Lambda 基础语法 函数式接口 常用的函数式接口 消费型接口 供给型接口 断言型接口 函数型接口 方法引用 数组引用 构造器引用 总结 参考阅读 理解Lambda Lambda表达式可以 ...

  8. vue检查用户名是否重复

    前端函数如下,js方法代码无需更改,前端代码逻辑在components\common\lab_header.vue 只需要修改components\axios_api\http.js中调用的后端地址 ...

  9. HTTPS和HTTP的那些事

    随着信息安全变得越来越重要,在浏览器.搜索引擎.CA机构.大型互联网企业的共同促进下,互联网迎来了"HTTPS加密时代".HTTPS在HTTP上建立了SSL加密层,是HTTP协议的 ...

  10. Greenplum 性能优化之路 --(一)分区表

    一.什么是分区表 分区表就是将一个大表在物理上分割成若干小表,并且整个过程对用户是透明的,也就是用户的所有操作仍然是作用在大表上,不需要关心数据实际上落在哪张小表里面.Greenplum 中分区表的原 ...