《HTTP权威指南》 第7章 缓存

带着问题学习:

  • 缓存如何提高性能
  • 如何衡量缓存的有效性
  • 缓存置于何处作用最大
  • HTTP如何保持缓存副本的新鲜度
  • 缓存如何与其他缓存及服务器通信

web缓存是可以自动保存常见文档副本HTTP设备

缓存优点

  • 减少冗余的数据传输,节省网络费用
  • 缓解网络瓶颈问题,更快加载
  • 降低了对原始服务器的要求,服务器更快响应,避免过载
  • 降低了距离时延

缓解网络瓶颈

缓存可以改善有限广域带宽造成的网络瓶颈

破坏瞬时拥塞

很多人同时访问一个文档,造成过多流量峰值,就会出现瞬时拥塞
在这里插入图片描述

降低距离时延

假设Web页面需要请求20个小图片,支持4个并行连接,每个请求传输需要15ms(直线距离除光速传输速度换算而来),一个来回是30ms。全部请求完成至少需要多少时间?

答案如图所示:
在这里插入图片描述
基于TCP慢启动的特性,完全启动4个并发连接需要的来回数连接1 >> 连接2&3+图片1 >> 连接4+图片2&3 =3
剩余请求需要的来回数:(20+1-3)➗4=5(需要加上一个web基础页面)
因此总来回数是,3+5=8,至少需要8个完整来回,也就是8*30ms=240毫秒

总结一下完全启动所需的连接并发数(N)最少需要几个来回(m)m = N//2 + 1 if N%2 > 0 else N//2(如果N不能整除2,就是N整除2加1个来回,否则是N整除2个来回)

命中与未命中

用已有的副本为某些到达缓存的请求提供服务,称为缓存命中
其他一些到达缓存的请求没有副本可用,而被转发到原始服务端,称为缓存未命中

HTTP再验证

验证缓存是否仍是服务器的最新副本,这些”新鲜度检测“被称为HTTP再验证
在这里插入图片描述
再验证过程:向原始服务器发送一个小的再验证请求,内容无变化时服务端返回304,缓存标记为暂时新鲜,并将副本返回给客户端,这被称为再验证命中缓慢命中

请求速度快慢缓存命中 > 缓存再验证命中 > 缓存再验证未命中 ~ 缓存未命中(成功的再验证比未命中要快,省去了查询数据和构建响应的过程,但失败的再验证几乎与未命中速度一样)
在这里插入图片描述
通常进行再验证会添加If-Modified-Since首部
在这里插入图片描述
再验证未命中时,服务器会回送一条带有完整内容的响应,供缓存更新
若再验证时发现对象被删除,则服务器返回一个404,缓存收到会将其副本删除

(文档)命中率

由缓存提供服务的请求所占的比例称为缓存命中率(或文档命中率)。合理命中率约为40%。

字节命中率

由于文档的尺寸不同,文档命中率不能说明一切,更愿意使用字节命中率作为度量值。
字节命中率表示缓存提供的字节在传输的所有字节中所占的比例。100%字节命中率说明全部来自缓存。

区分命中和未命中

客户端可以通过响应的Date首部与当前时间判断,日期早说明是缓存。或者通过Age首部来检测缓存的响应,可分辨出响应的使用期。

缓存的拓扑结构

单个用户专有的缓存为私有缓存,公共的缓存被称为公有缓存
在这里插入图片描述

私有缓存

Web浏览器有内建的私有缓存,允许用户自行配置。

公有缓存

公有缓存是特殊的共享代理服务器,被称为缓存代理服务器(代理缓存)。
在这里插入图片描述

代理缓存的层次结构

在这里插入图片描述
在缓存层次结构深的情况下,请求可能要穿过很长一溜缓存,每个拦截代理都会增加性能损耗。

各类型缓存

有些网格结构会构建复杂的网状缓存。网状缓存中的代理缓存会进行更复杂的对话,做出动态缓存通信决策,决定与哪个父缓存对话,或者绕开缓存直接连接原始服务器,这种代理缓存可称为内容路由器

内容路由器功能:选择父缓存or原始服务器 >> 选择特定父缓存 >> 在前往父缓存前搜索本地副本 >> 允许其他缓存对其缓存的部分内容进行访问

缓存之间允许不同组织互为对等实体,提供可选的对等支持的缓存称为兄弟缓存,但HTTP并不支持兄弟缓存,所以有额外的协议对HTTP进行了扩展,比如因特网缓存协议ICP和超文本缓存协议HTCP。
在这里插入图片描述

缓存的处理步骤

在这里插入图片描述
大多数缓存都会保存缓存命中和未命中数据的统计数据,将条目插入一个用来显示请求类型、URL和所发生事件的日志文件

缓存处理流程图

在这里插入图片描述

保持副本的新鲜

文档过期首部

HTTP让原始服务器向每个文档附加一个过期日期Cache-Control首部和Expires首部
在这里插入图片描述
缓存过期前,可以以任意频率使用这些副本,除非客户端请求阻止提供已缓存或未验证资源的首部,过期后必须与服务器进行核对。

过期日期和使用期

Cache-Control首部使用的是相对时间而非绝对日期,绝对日期依赖计算机时钟的正确设置,一般更倾向于用相对时间的Cache-Control首部。
在这里插入图片描述

服务器再验证

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

  • 足够新鲜的已缓存副本
  • 再验证后仍然新鲜的已缓存副本
  • 再验证时发现原始服务器故障,返回一条错误报文
  • 附有金高信息说明内容可能不正确的已缓存副本

用条件方法进行再验证

HTTP定义了5个条件请求首部,最有用的是If-Modified-Since(IMS)和If-None-Match
在这里插入图片描述

If-Modified-Since:Date再验证

If-Modified-Since为真表示文档被修改了,服务器返回新首部新文档新的过期时间给缓存,没修改过为假,会返回一个新的过期日期。可以与Last-Modified首部配合工作。
在这里插入图片描述
判断的时候是将IMS日期于最后修改日期进行字符串匹配(即判断更新日期是否一致),是“如果最后的修改不是在这个确定的日期进行的”,而不是“如果在这个日期之后没有被修改过”。

If-None-Match:实体标签再验证

遇到下方的场景通常用If-None-Match实体标签再验证:

  • 有些文档会被周期性写入,内容没有变化,但修改日期改变了
  • 文档可能被修改了,但该改动不重要
  • 有些服务器无法准确判定其页面的最后修改日期
  • 有些文档会以亚秒(一秒的十亿分之一)间隙发生变化,以一秒为粒度的修改日期可能不够用

在这里插入图片描述

If-None-Match通过服务器返回的实体标签(ETag)再验证。

也可以在If-None-Match首部包含几个实体标签,逗号隔开,表示缓存已存在这些实体标签的对象副本。

If-None-Match: "v2.6"
If-None-Match: "v2.4","v2.5","v2.6"
If-None-Match: "foobar","A34FAC0095","Profiles in Courage"

强弱验证器

实体标签和最近修改日期都是缓存验证器。HTTP/1.1支持弱验证器,表示进行了少量修改,声明是“足够好”的等价体。服务器用“W/”标识弱验证器。

ETag: W/"v2.6"
If-None-Match: W/"v2.6"

什么时候使用实体标签和最近修改日期

  • 服务器只回送了一个Last-Modified最后修改日期,则客户端用If-Modified-Since验证
  • 服务器只回送Etag实体标签,客户端用If-None-Match验证
  • 实体标签和最后修改日期都提供了,则都进行验证

控制缓存的能力

缓存多长时间,按照优先级递减的顺序,服务器可以:

  • 附加一个Cache-Control: no-store 首部到响应中去;
  • 附加一个Cache-Control: no-cache 首部到响应中去;
  • 附加一个Cache-Control: must-revalidate 首部到响应中去;
  • 附加一个Cache-Control: max-age 首部到响应中去;
  • 附加一个Expires 日期首部到响应中去;
  • 不附加过期信息,让缓存确定自己的过期日期。

no-store首部(禁止复制响应)和no-cache首部(新鲜度再验证前不能返回缓存)可以防止缓存提供未经证实的已缓存对象。

must-revalidate表示严格遵循过期时间,到期要进行再验证,验证通过才发送副本。

max-age最长可以处于新鲜状态的秒数,为0则不缓存,如:Cache-Control: max-age=0s-maxage类似,但适用于公有缓存。

不推荐使用Expires绝对日期作为过期日期

试探性过期

服务器没有提供过期相关的首部,缓存可以使用任意算法(比如LM-Factor)计算出一个试探性的最大使用期,但如果大于24小时,则应该添加一个试探性过期警告13。(默认的新鲜周期通常是一小时或一天)

客户端的新鲜度设置

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88068.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十三章 模板

函数模板 函数模板使用 函数模板注意事项 自动类型推导,必须推导出一致的数据类型T,才可以使用 模板必须要确定出T的数据类型,才可以使用 普通函数和函数模板的类型转化 普通函数隐式类型转化(char转int) 函数模板正常使用不会发生…

云计算-专有网络VPC

🌐 什么是 VPC?(Virtual Private Cloud) VPC(Virtual Private Cloud,虚拟私有云) 是公有云服务商提供的一种网络隔离服务,允许用户在云中创建一个逻辑隔离的私有网络环境。你可以在这…

关于*gin.Context的理解

关于*gin.Context的理解 作为初学者,在学习go语言用gin开发web时,我对*gin.Context感到困惑。本文章以自我总结为主,大部分为来自询问ai后的总结,如有问题欢迎指出。 *gin.Context可以理解为一个gin框架的上下文对象指针&#x…

Qt中的OpenGL (6)[坐标系统]

文章目录 文章说明学习目标目录结构坐标系统局部空间世界空间观察空间裁剪空间正射投影矩阵透视投影矩阵组合进入3D世界顶点数据着色器设置数据矩阵设置文章说明 本文是学习OpenGL的笔记,主要参考大神JoeyDeVries的LearnOpenGL第八课《坐标系统》,并将教程中的代码基于Qt进行…

Spring Aop @After (后置通知)的使用场景?

核心定义 After 是 Spring AOP 中的另一种通知(Advice)类型,通常被称为“后置通知”或“最终通知”。 它的核心作用是: 无论目标方法是正常执行完成,还是在执行过程中抛出了异常,After 通知中的代码 总是…

UNet改进(4):交叉注意力(Cross Attention)-多模态/多特征交互

在计算机视觉领域,UNet因其优异的性能在图像分割任务中广受欢迎。本文将介绍一种改进的UNet架构——UNetWithCrossAttention,它通过引入交叉注意力机制来增强模型的特征融合能力。 1. 交叉注意力机制 交叉注意力(Cross Attention)是一种让模型能够动态地…

C#里从CSV文件加载BLOB数据字段到数据库的处理

大量的数据保存在CSV文件, 当需要把这些数据加载到数据库,然后使用数据库来共享出去。 就需要把CSV文件导入数据库, 怎么样快速地把CSV文件导入数据库呢? 这个就需要使用类MySqlBulkLoader,它是mariadb数据库快速导入的方式。 一般使用SQL语句导入是10秒,那么使用这种方…

【后端】负载均衡

长期不定期更新补充。 定义 负载均衡(Load Balancing)是指将来自客户端的请求合理分发到多个服务器或服务节点,以提高系统性能、可用性与可靠性。 分工 前端不做负载均衡,前端只发请求,不知道请求去哪台服务器。 负…

记录一次:Java Web 项目 CSS 样式/图片丢失问题:一次深度排查与根源分析

记录一次:Java Web 项目 CSS 样式/图片丢失问题:一次深度排查与根源分析 **记录一次:Java Web 项目 CSS 样式丢失问题:一次深度排查与根源分析****第一层分析:资源路径问题****第二层分析:服务端跳转逻辑**…

torchmd-net开源程序是训练神经网络潜力

​一、软件介绍 文末提供程序和源码下载 TorchMD-NET 提供最先进的神经网络电位 (NNP) 和训练它们的机制。如果有多个 NNP,它可提供高效、快速的实现,并且它集成在 GPU 加速的分子动力学代码中,如 ACEMD、OpenMM 和 …

在Docker上安装Mongo及Redis-NOSQL数据库

应用环境 Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-139-generic x86_64) Docker version 28.1.1, build 4eba377 文章目录 一、部署Mongo1. 拉取容器镜像2. 生成Run脚本2.1 准备条件2.2 参数解读2.3 实例脚本 3. 实例操作3.1 Mongo bash控制台3.2 库表操作 4. MongoDB Compass (G…

Java 编程之责任链模式

一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种行为型设计模式,它让多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,沿着这条…

1、做中学 | 一年级上期 Golang简介和安装环境

一、什么是golang Golang,通常简称 Go,是由 Google 公司的 Robert Griesemer、Rob Pike 和 Ken Thompson 于 2007 年创建的一种开源编程语言,并在 2009 年正式对外公布。 已经有了很多编程语言,为什么还要创建一种新的编程语言&…

Linux--迷宫探秘:从路径解析到存储哲学

上一篇博客我们说完了文件系统在硬件层面的意义,今天我们来说说文件系统在软件层是怎么管理的。 Linux--深入EXT2文件系统:数据是如何被组织、存储与访问的?-CSDN博客 🌌 引言:文件系统的宇宙观 "在Linux的宇宙中…

淘宝商品数据实时获取方案|API 接口开发与安全接入

在电商数据获取领域,除了官方 API,第三方数据 API 接入也是高效获取淘宝商品数据的重要途径。第三方数据 API 凭借丰富的功能、灵活的服务,为企业和开发者提供了多样化的数据解决方案。本文将聚焦第三方数据 API 接入,详细介绍其优…

什么是防抖和节流?它们有什么区别?

文章目录 一、防抖(Debounce)1.1 什么是防抖?1.2 防抖的实现 二、节流(Throttle)2.1 什么是节流?2.2 节流的实现方式 三、防抖与节流的对比四、总结 在前端开发中,我们经常会遇到一些高频触发的…

Springboot集成阿里云OSS上传

Springboot集成阿里云OSS上传 API 接口描述 DEMO提供的四个API接口,支持不同方式的文件和 JSON 数据上传: 1. 普通文件上传接口 上传任意类型的文件 2. JSON 字符串上传接口 上传 JSON 字符串 3. 单个 JSON 压缩上传接口 上传并压缩 JSON 字符串…

删除大表数据注意事项

数据库是否会因删除操作卡死,没有固定的 “安全删除条数”,而是受数据库配置、表结构、操作方式、当前负载等多种因素影响。以下是关键影响因素及实践建议: 一、导致数据库卡死的核心因素 硬件与数据库配置 CPU / 内存瓶颈:删除…

Redis 是单线程模型?|得物技术

一、背景 使用过Redis的同学肯定都了解过一个说法,说Redis是单线程模型,那么实际情况是怎样的呢? 其实,我们常说Redis是单线程模型,是指Redis采用单线程的事件驱动模型,只有并且只会在一个主线程中执行Re…

[特殊字符] AIGC工具深度实战:GPT与通义灵码如何彻底重构企业开发流程

🔍 第一模块:理念颠覆——为什么AIGC不是“玩具”而是“效能倍增器”? ▍企业开发的核心痛点图谱(2025版) ​​研发效能瓶颈​​:需求膨胀与交付时限矛盾持续尖锐,传统敏捷方法论已触天花板​…