HTTP基本概念-HTTP缓存技术

大家好我是苏麟 , 今天说说HTTP缓存技术 .

资料来源 : 小林coding

小林官方网站 : 小林coding (xiaolincoding.com)

HTTP缓存技术

HTTP 缓存有哪些实现方式?

对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,那么下次就直接读取本地的数据,不必在通过网络获取服务器的响应了,这样的话HTTP/1.1 的性能肯定肉眼可见的提升。

所以,避免发送 HTTP 请求的方法就是通过缓存技术,HTTP 设计者早在之前就考虑到了这点,因此 HTTP协议的头部有不少是针对缓存的字段。

HTTP 缓存有两种实现方式,分别是强制缓存协商缓存

什么是强制缓存?

强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。

如下图中,返回的是 200 状态码,但在 size 项中标识的是 from disk cache,就是使用了强制缓存

强缓存是利用下面这两个 HTTP 响应头部(Response Header)字段实现的,它们都用来表示资源在客户端缓存的有效期:

  • Cache-Control ,是一个相对时间
  • Expires ,是一个绝对时间

如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control的优先级高于 Expires 

Cache-control选项更多一些,设置更加精细,所以建议使用 Cache-Control 来实现强缓存。具体的实现流程如下:

  • 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上Cache-Control,Cache-Control 中设置了过期时间大小
  • 浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器
  • 服务器再次收到请求后,会再次更新Response 头部的 Cache-Control。

什么是协商缓存?

当我们在浏览器使用开发者工具的时候,你可能会看到过某些请求的响应码是 304 ,这个是告诉浏览器可以使用本地缓存的资源,通常这种通过服务端告知客户端是否可以使用缓存的方式被称为协商缓存。

上图就是一个协商缓存的过程,所以协商缓存就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。

协商缓存可以基于两种头部来实现。

第一种:请求头部中的lf-Modified-Since字段与响应头部中的 Last-Modified 字段实现,这两个字段的意思是:

  • 响应头部中的 Last-Modified :标示这个响应资源的最后修改时间
  • 请求头部中的 lf-Modified-Since :当资源过期了,发现响应头中具有 Last-Modified 声明,则再次发起请求的时候带上 Last-Modified 的时间,服务器收到请求后发现有 lf-Modified-Since 则与被请求资源的最后修改时间进行对比(Last-Modified),如果最后修改时间较新(大),说明资源又被改过,则返回最新资源,HTTP 200 OK;如果最后修改时间较旧(小),说明资源无新修改,响应HTTP 304 走缓存。

第二种:请求头部中的 lf-None-Match 字段与响应头部中的 ETag 字段,这两个字段的意思是

  • 响应头部中 Etag :唯一标识响应资源
  • 请求头部中的 lf-None-Match :当资源过期时,浏览器发现响应头里有 Etag,则再次向服务器发起请求时,会将请求头 If-None-Match 值设置为 Etag 的值。服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200。

第一种实现方式是基于时间实现的,第二种实现方式是基于一个唯一标识实现的,相对来说后者可以更加准确地判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题。

如果在第一次请求资源的时候,服务端返回的 HTTP 响应头部同时有 Etag 和 Last-Modified 字段,那么客户端再下一次请求的时候,如果带上了 ETag 和 Last-Modified 字段信息给服务端,这时 Etag 的优先级更高,也就是服务端先会判断 Etag 是否变化了,如果 Etag 有变化就不用在判断 Last-Modified 了,如果Etag 没有变化,然后再看 Last-Modified。

为什么 ETag 的优先级更高?这是因为 ETag 主要能解决 Last-Modified 几个比较难以解决的问题

  • 在没有修改文件内容情况下文件的最后修改时间可能也会改变,这会导致客户端认为这文件被改动了,从而重新请求
  • 可能有些文件是在秒级以内修改的, lf-Modified-Since能检查到的粒度是秒级的,使用 Etag就能够保证这种需求下客户端在1秒内能刷新多次
  • 有些服务器不能精确获取文件的最后修改时间

注意,协商缓存这两个字段都需要配合强制缓存中 Cache-Control 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。

下图是强制缓存和协商缓存的工作流程 : 

当使用 ETag 字段实现的协商缓存的过程

  • 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上ETag 唯一标识,这个唯一标识的值是根据当前请求的资源生成的
  • 当浏览器再次请求访问服务器中的该资源时,首先会先检查强制缓存是否过期: 如果没有过期,则直接使用本地缓存; 如果缓存过期了,会在 Request 头部加上 lf-None-Match 字段,该字段的值就是 ETag 唯一标识;
  • 服务器再次收到请求后,会根据请求中的 If-None-Match 值与当前请求的资源生成的唯一标识进行比较: 如果值相等,则返回 304 Not Modified,不会返回资源; 如果不相等,则返回 200 状态码和返回资源,并在 Response 头部加上新的 ETag 唯一标识
  • 如果浏览器收到 304 的请求响应状态码,则会从本地缓存中加载资源,否则更新资源。

这期就到这里 , 下期见!

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

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

相关文章

【C语言】指针练习篇(上),深入理解指针---指针和数组练习题和sizeof,strlen的对比【图文讲解,详细解答】

欢迎来CILMY23的博客喔,本期系列为【C语言】指针练习篇(上),深入理解指针---指针数组练习题和sizeof,strlen的对比【图文讲解,详细解答】,图文讲解指针和数组练习题,带大家更深刻理解指针的应用…

iTop-4412 裸机程序(二十二)- RTC时钟

目录 0.源码1. RTC2. iTop4412 中的 RTC使用的相关寄存器3. BCD编码4. 关键源码 0.源码 GitHub:https://github.com/Kilento/4412NoOS 1. RTC RTC是实时时钟(Real Time Clock)的缩写,是一种用于计算机系统的硬件设备&#xff0…

Matplotlib自定义辅助函数 (一):让你的图表大放异彩!

Matplotlib美化秘诀:自定义辅助函数,让你的图表大放异彩! 利用Matplotlib进行数据可视化示例 🌵文章目录🌵 🌳一、创建自定义样式函数🌳🌳二、创建自定义颜色映射🌳&…

Momentum2

攻击机 192.168.223.128 目标机 192.168.223.147 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -A -p- 192.168.223.147 开启了22 80 端口 看一下web界面 源码,robots.txt ,url都观察了一下好像没什么有用信息 扫一下目录 gobuster dir -u http:…

实现JNDI

实现JNDI 问题陈述 Smart Software Developer Ltd.想要开发一款Web应用程序,它使用servlt基于雇员ID显示雇员信息,雇员ID由用户通过HTML用户界面传递。雇员详细信息存储在Employee_Master表中。另外,Web应用程序应显示网站被访问的次数。 解决方案 要解决上述问题,需要执…

Linux中sigaction函数和SIGCHLD信号的使用

sigaction函数: 函数说明:注册一个信号处理函数 函数原型:int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 函数参数: signum:捕捉的信号act:传入参数,…

Verilog不支持浮点数以及错误事例

Verilog 是一种硬件描述语言(HDL),用于描述和设计数字电路和系统。它的主要目的是描述硬件行为和结构,因此不直接支持浮点数。Verilog 主要用于设计数字逻辑电路、处理器和其他数字系统,它的数据类型主要是位向量和整数…

C++ 特殊类的实现

一、请设计一个类,不能被拷贝 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 在C98中:将拷贝构造函数与赋值运算符重载…

【嵌入式移植】6、U-Boot源码分析3—make

U-Boot源码分析3—make all 从【嵌入式移植】4、U-Boot源码分析1—Makefile文章中可知执行make命令的时候,没有指定目标则使用默认目标PHONY,PHONY依赖项为_all all scripts_basic outputmakefile scripts dtbs。 all Makefile中第129行指定默认目标PH…

十大免费 Word 转 PDF 转换器工具榜单

将 Word 转换为 PDF 格式可以帮助您在不同操作系统之间轻松共享文件。无论您是发送重要备忘录、为客户开具发票、以一致的格式维护客户记录等等,PDF 都属于最流行且安全的文件格式。当您将 Word 文档转换为 PDF 格式时,您的项目会自动优化且更加紧凑。可…

腾讯云4核8G服务器够用吗?能支持多少人?

腾讯云4核8G服务器支持多少人在线访问?支持25人同时访问。实际上程序效率不同支持人数在线人数不同,公网带宽也是影响4核8G服务器并发数的一大因素,假设公网带宽太小,流量直接卡在入口,4核8G配置的CPU内存也会造成计算…

ELAdmin 部署

后端部署 按需修改 application-prod.yml 例如验证码方式、登录状态到期时间等等。 修改完成后打好 Jar 包 执行完成后会生成最终可执行的 jar。JPA版本是 2.6,MyBatis 版本是 1.1。 启动命令 nohup java -jar eladmin-system-2.6.jar --spring.profiles.active…

JDBC教程+数据库连接池

JDBC 1.JDBC概述 ​ JDBC,全称Java数据库连接(Java DataBase Connectivity),它是使用Java语言操作关系型数据库的一套API。 ​ JDBC本质是官方(原SUN公司,现ORACLE)定义的一套操作所有关系型数…

Flutter 网络请求之Dio库

Flutter 网络请求之Dio库 前言正文一、配置项目二、网络请求三、封装① 单例模式② 网络拦截器③ 返回值封装④ 封装请求 四、结合GetX使用五、源码 前言 最近再写Flutter系列文章,在了解过状态管理之后,我们再来学习一下网络请求。 正文 网络请求对于一…

starknet之 class_hash

文章目录 问题背景什么是Class Hash问题背景 部署合约报错:ReferenceError: Buffer is not defined 什么是Class Hash 官方: https://book.starknet.io/ch04-03-01-deploy-standard-account.html?highlight=class%20hash#finding-the-class-hash 要部署智能合约,您需要在…

微软在其Windows系统中暗示了AI的未来,推出了更聪明的Copilot功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

批量梯度下降、随机梯度下降、小批量梯度下降

一、批量梯度下降(Batch Gradient Descent,BGD) 在批量梯度下降中,每次迭代都使用整个训练集的数据进行梯度计算和参数更新。也就是说,每次迭代都对所有的样本求取梯度,然后更新参数。由于要处理整个训练集&#xff0c…

刷题计划_冲绿名

现在 rating 是 1104 准备刷 100道 1200的题,把实力提升到 1200 ,上一个绿名 每一个分数段的题都写一百道,争取早日上蓝 现在 虽然 cf 里面显示写了一些这个分数段的题,但是自己训练的时候,其实是没有训练一道这个分…

【Py/Java/C++三种语言详解】LeetCode每日一题240214【二叉树BFS】LeetCode102、二叉树的层序遍历

有LeetCode交流群/华为OD考试扣扣交流群可加:948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目链接题目描述解题思路DFS和BFS异同用队列维护的BFS 代码PythonJavaC时空复杂度 相关习题华为OD算法/大…

Linux 基础/子目录分配/文件路径

在Linux系统中,整个系统只具有一个根目录“/”,用斜杠表示。根目录是整个文件系统的顶层目录,在他下面可以创建其他的目录和文件。 Linux中的子目录分配: /bin - 基本命令的二进制文件,这些命令可供所有用户使用&am…