分布式软件架构——客户端缓存

news2024/11/15 11:02:07

浏览器的客户端缓存

当万维网刚刚出现的时候,浏览器的缓存机制差不多就已经存在了。在 HTTP 协议设计之初,人们便确定了服务端与客户端之间“无状态”(Stateless)的交互原则,即要求客户端的每次请求是独立的,每次请求无法感知、也不能依赖另一个请求的存在,这既简化了 HTTP 服务器的设计,也为它的水平扩展能力留下了广阔的空间。
但无状态并不是只有好的一面。因为客户端的每次请求都是独立的,服务端不会保存之前请求的状态和资源,所以也不可避免地导致它会携带重复的数据,造成网络性能的降低。
那么,HTTP 协议针对这个问题的解决方案,就是客户端缓存。从 HTTP/1.0 到 1.1、再到 2.0 版本的演进中,逐步形成了现在被称为“状态缓存”、“强制缓存”(或简称为“强缓存”)和“协商缓存”这三种 HTTP 缓存机制。

状态缓存

这其中的状态缓存,是指不经过服务器,客户端直接根据缓存信息来判断目标网站的状态。以前只有301/Moved Permanently(永久重定向)这一种,后来在RFC6797中增加了HSTS(HTTP Strict Transport Security)机制,用来避免依赖301/302跳转HTTPS时,可能产生的降级中间人劫持问题,这也属于另一种状态缓存。
在这里插入图片描述
下面是浏览www.hao123.com时发生302重定向的结果状态码,
在这里插入图片描述

几种重定向状态码区别

  • 301 Moved Permanently:永久性定向,该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI;
  • 302 Found:临时性重定向,该状态码表示请求的资源已被分配了新的URI,用户本次临时能使用的URI访问;
  • 303 See Other,307 Temporary Redirect等等略;

比如在Web浏览器中输入www.baidu.com/,而不是http://www.baidu.com/。在这种情况下浏览器假设你想使用HTTP协议,所以它在这个阶段发出一个HTTP请求到www.baidu.com/,同时Web Server会返回301状态码请求重定向到HTTPS站点。接下来浏览器使用HTTPS连接到www.baidu.com/(最终URLhttps://www.baidu.com/)。这时HSTS安全策略保护开始使用HTTP响应头:

Strict-Transport-Security: max-age=172800; includeSubDomains; preload

在这里插入图片描述

响应头的 Strict-Transport-Security 给浏览器提供了详细的说明。 从现在开始,每个连接到该网站及其子域的下一年(172800秒)从这个头被接收的时刻起必须是一个 HTTPS 连接。 HTTP 连接是完全不允许的。 如果浏览器接收到使用 HTTP 加载资源的请求,则必须尝试使用 HTTPS 请求替代。 如果 HTTPS 不可用,则必须直接终止连接。

此外,如果证书无效,将阻止你建立连接。 通常来说,如果 HTTPS 证书无效(如:过期、自签名、由未知 CA 签名等),浏览器会显示一个可以规避的警告。 但是,如果站点有 HSTS,浏览器就不会让你绕过警告。 若要访问该站点,必须从浏览器内的 HSTS 列表中删除该站点。

强制缓存

它对一致性问题的处理策略十分直接:假设在某个时间点内,比如服务器收到响应后的10分钟内,资源的内容和状态一定不会被改变,因此客户端可以不需要经过任何请求,在该时间点到来之前一直持有和使用该资源的本地缓存副本。
根据约定,在浏览器的地址输入、页面链接跳转、新开窗口、前进和后退中,强制缓存都可以生效,但在用户主动刷新页面时应当自动失效
在HTTP协议中,设置了两类可以实现强制缓存的Headers:Expires和Cache-Control

Expires

它是HTTP/1.0协议中开始提供的Header,后面跟随一个截止时间参数。当服务器返回某个资源时,如果带有该Header的话,就意味着服务器承诺在截止时间之前,资源不会发生变动,浏览器可以直接缓存该数据,不再重新发起请求。如下示例,

HTTP/1.1 200 OK
Expires:Sun, 2 Jul 2023 11:26:15 GMT

那么过期时间很直观,但它存在下面几个问题

  1. 受限于客户端的本地时间;
  2. 无法处理涉及到用户身份的私有资源;
  3. 无法描述“不缓存”的语义;

Cache-Control

它是HTTP/1.1协议中开始提供的Header,它的语义更丰富。如果两者同时存在,并且语义存在冲突时,IETF规定必须以Cache-Control为准,以下面为例,下面是缓存时间600秒,

HTTP/1.1 200 OK
Cache-Control:max-age=600

Cache-Control标准的参数包括下面几种:

  • max-age:跟随一个数字,以秒为单位,表示相对于请求时间(Date)多少秒以内,缓存有效;
  • s-maxage:共享缓存的有效时间,提示CDN这类服务器如何对缓存进行失效;
  • public:资源可以被代理、CDN等缓存;
  • private:只能由用户的客户端进行私有缓存;
  • no-cache:不应被缓存,哪怕同一个会话中对同一个URL地址的请求也必须从服务端获取,从而令强制缓存完全失效;
  • no-store:不强制会话中是否重复获取相同的URL资源,但它禁止浏览器、CDN等以任何形式保留该资源;
  • no-transform:禁止资源以任何形式被修改;
  • min-fresh:跟随一个数字,以秒为单位,用于建议服务器能返回一个不少于该时间的缓存资源;
  • only-if-cached:表示服务器希望客户端不要发送请求,只使用缓存来进行响应,若缓存不能命中,则直接返回503/Service Unavailable错误;
  • must-revalidate:表示资源国旗后,一定要从服务器中进行获取,即超过了max-age的时间后,就等同于no-cache;
  • proxy-revalidate:用于提示代理、CDN等资源过期后的缓存行为,除对象不同外,语义和must-revalidate完全一致;

下面是no-cache的示例,
在这里插入图片描述

协商缓存

在HTTP中,协商缓存与强制缓存并没有互斥性,两套机制可以并行工作。协商缓存有下面两种变动检查机制。

根据资源的修改时间进行检查

  • Last-Modified:服务器的响应Header,用来告诉客户端这个资源的最后修改时间;
  • If-Modified-Since:当客户端再次请求时,会通过If-Modified-Since把之前收到的资源最后修改时间发送回服务端;
    如果此时,服务端发现资源在该时间后没有被修改过,就只要返回一个304/Not Modified的响应即可,无需附带消息体,从而达到节省流量的目的。

根据资源唯一表示是否发生变化来检查

  • Etag:服务器的响应Header,用于告诉客户端这个资源的唯一标识。
  • If-None-Match:客户端再次请求时,会通过If-None-Match把之前收到的资源唯一标识发送回服务端;

另外Etag是HTTP中一致性最强的缓存机制。Last-Modified可能产生资源一致性问题,但Etag不会。但是Etag的获取需要服务端对资源(比如Apache服务器的Etag值默认是对文件的索引节点、大小和最后修改时间)进行哈希计算得到,所以开销会大很多。

HTTP的内容协商机制

HTTP协议设计了Accept*、Content-*的响应Header,这些被称为HTTP的内容协商机制。这些响应的含义根据MINE类型和浏览器资源来缓存资源。

参考链接:
1、https://zhuanlan.zhihu.com/p/130946490

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

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

相关文章

MySQL环境搭建(Windows电脑)

MySQL环境搭建-Windows电脑篇 软件获取: 搜索gzh【李桥桉】,需要win电脑安装包,回复【win-MS】。 搜索gzh【李桥桉】,需要mac电脑安装包,回复【mac-MS】。 注意:确保电脑为64位系统(不是的话需要…

华为手环8相册表盘使用指南

随着科技的发展,智能手环已经成为越来越多人的选择。华为手环8作为一款备受好评的智能手环,不仅具备精准的监测功能,还拥有丰富的表盘样式。本文将向您介绍华为手环8如何使用相册表盘,通过这一功能,您可以轻松地将您的…

Windows 打开cmd/dos窗口的12种方式(全网最全)

文章目录 1. 从开始菜单的应用列表打开2. 从搜索打开3. 从运行打开4. 从文件资源管理器打开5. 从C:\Windows\System32\cmd.exe打开6. 从桌面>快捷方式打开(需自己创建)7. 从任务栏>快捷方式打开(需自己创建)8. 从开始菜单&g…

TV快应用系列——1.ExtScreen框架快速入门

系列文章目录 TV快应用系列——1.ExtScreen框架快速入门 ExtScreen框架快速入门 系列文章目录前言一、ExtScreen简介整体结构扩展屏和应用的区别 二、安装和环境配置1.安装编辑工具2.安装Vue开发环境1.1.1安装 Node1.1.2安装配置 npm下载安装npmnpm 设置淘宝镜像安装 vue-cli&…

图像分割的大变革:从SAM(分割一切)到FastSAM、MobileSAM

前言 SAM就是一类处理图像分割任务的通用模型。与以往只能处理某种特定类型图片的图像分割模型不同,SAM可以处理所有类型的图像。 在SAM出现前,基本上所有的图像分割模型都是专有模型。比如,在医学领域,有专门分割核磁图像的人工…

『DotNetBrowser』在.Net中的浏览器嵌入组件,该选择DotNetBrowser 还是 CefSharp?

📣读完这篇文章里你能收获到 全方位对比DotNetBrowser 和 CefSharp的优缺点 文章目录 一、引言二、引擎三、架构1. CefSharp架构2. DotNetBrowser架构 四、对比1. 稳定性和内存使用2. 应用程序域3. AnyCPU4. H.264, AAC5. 安全6. Visual Studio设计器7. 嵌入应用程…

八、c++学习(加餐4:深入分析new和delete)

经过了两篇的类和对象分析,我们这一篇再次加餐,对new和malloc的分析,malloc的源码不在这篇介绍,会放到linux篇的内存池专题,所以我们这篇只要分析new。 这篇的主要目的就是,对象是怎么new出来的&#xff0…

技术干货——Selenium Python使用技巧(三)

目录 处理不同情况的等待 网页中的滚动操作 使用Selenium放大和缩小 查找元素的大小 获取元素的X和Y坐标 使用自定义配置文件禁用JavaScript 设置手动代理设置 总结: 处理不同情况的等待 在Selenium自动化测试中网页可能需要花费一些时间来加载,…

MybatisPlus从入门到精通-基础篇

文章目录 一、概述二、快速入门2.1 数据库准备2.2 创建springboot工程2.3 实体类准备2.4 测试MybatisPlus 三、MP常用配置3.1 设置表映射规则3.2 设置主键生成策略3.3 设置字段映射关系3.4 设置字段和列名的驼峰映射3.5 日志 四、基本使用4.1 增加(插入)…

TF卡/U盘扩容

1. 问题 在使用大于镜像、对TF卡/U盘烧录镜像以后,TF卡/U盘会出现一部分的空闲内存无法被使用,导致出现使用空间不足的报错,或运行大型项目不成功。 注意:本教程仅针对自行烧录镜像的用户,TF卡/U盘内如有出厂镜像则可…

【数据挖掘】时间序列教程【四】

3.3 划分变体 我们可以对上述 的主模型采用方差分析方法,并将中的总变异分解为 为残差平方和和可归因于各种频率的变化。 第二行是可能的,因为平方的所有交叉项都等于零,即对于所有 ,

基于JavaSwing的五子棋游戏设计

点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/87987074?spm1001.2014.3001.5503 运行截图:

4.22. 卷积定理

1. 时域: 我们知道卷积运算是为了求系统的零状态响应的,即,如果输入给系统的信号是f(t),系统函数是h(t),那系统的输出是什么? 就是按照上述方式卷积得到 那上述的卷积在频率域是什么呢? 2. 卷积…

windows系统下的nvm环境安装

1、下载 https://github.com/coreybutler/nvm-windows/releases 直接下载zip包 并安装 2、安装 注意:尽量按照默认路径安装 否则可能出现 nvm 安装完成 后面下载使用node的时候有问题 3、安装完成检测 打开cmd命令 输入 nvm -v出现版本号 则安装成功 4、se…

FullGC调优100倍,掌握这3招,吊打JVM调优

前言: 在40岁老架构师尼恩的读者社区(50)中,很多小伙伴拿不到offer,或者拿不到好的offer。 尼恩经常给大家 优化项目,优化简历,挖掘技术亮点。 在指导简历的过程中, 线上问题排查…

【实用教程】教你一招 IDE 中比较骚的操作技巧!

我靠,这是个高手!这真是个高手! IDEA 有个很牛逼的功能,那就是后缀补全(不是自动补全),很多人竟然不知道这个操作,还在手动敲代码。 这个功能可以使用代码补全来模板式地补全语句&…

02_04_02实时调度类_线程优先级代码实战

知识回忆 基础知识 Linux内核当中有3种调度策略: . SCHED_ OTHER分时调度策略;(普通进程) SCHED_ FIFO 实时调度策略,先到先服务; SCHED RR实时调度策略,时间片轮转。 备注:如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FI…

vim和vimplus安装详细步骤

1、vim安装 sudo apt update sudo apt install vim依次执行以上命令,安装好vim编辑器,安装好之后,直接使用vim hello.c进行测试,如果可以进入就没有问题。 2、vimplus安装 2.1 检查vim版本 vim --version vim --version | gre…

微信小程序入门教程

微信小程序入门教程 1、前言1. 相关介绍2. 开发工具 2、微信小程序注册3、 构建第一个微信小程序3.1 微信开发者工具3.1.1 小程序创建3.1.2 小程序项目结构目录介绍 3.2 Hbuilder 4、小程序的发布 1、前言 1. 相关介绍 要学习制作微信小程序,首先要先了解微信公众…

【数据库工具】 图文版介绍Xampp工具的使用实战

前言 有时候懒得安装数据库,就可以使用一些集成工具,比如XAMPP就是一个流行的软件包,便于搭建本地web环境,使用里面的mysql也是相当方便,今天我们就一起来看一下。 🏠个人主页:我是沐风晓月 &…