浏览器HTTP缓存解读(HTTP Status:200 304)

为什么要有浏览器缓存?

浏览器缓存(Brower Caching)是浏览器对之前请求过的文件进行缓存,以便下一次访问时重复使用,节省带宽,提高访问速度,降低服务器压力

http缓存机制主要在http响应头中设定,响应头中相关字段为Expires、Cache-Control、Last-Modified、Etag。

浏览器缓存从无到有,再到利用缓存的流程:

浏览器首次请求,缓存从无到有,缓存文件可能不一定是从web服务器请求来的,也可能是从CDN来的,但总而言之第一次一定是请求来的
在这里插入图片描述
浏览器对同样的资源发起二次请求,针对不同资源类型(比如JS文件等等),服务器进行判断

在这里插入图片描述
部分静态资源文件,可以判断缓存时长,如果未过期就可以从本地读取
在这里插入图片描述

浏览器缓存类型

- 强缓存

浏览器不会向服务器发送任何请求,直接从本地缓存中读取文件并返回 Status Code: 200 OK

从内存读取,因为速度快于硬盘,所以最优先由内存读取
在这里插入图片描述

从硬盘读取,如果内存中没有,就会从硬盘中读取
在这里插入图片描述

如果以上两个地方都没有对应的缓存资源,才会去服务器寻找对应的缓存资源。

补充一下,在强缓存中,普通刷新会忽略它,但不会清除它,需要强制刷新。浏览器强制刷新时,请求会带上Cache-Control:no-cache和Pragma:no-cache,这样就会让浏览器对资源进行重新请求。而普通刷新的情况下,部分资源文件(比如js、图片),不会带上no-cache属性,也就是会到服务器进行协商,请注意,这里属性携带的位置均位于请求头,而响应头是否设置,则取决于浏览器

- 协商缓存

所谓协商缓存,简单说就是先看看本地缓存过期没有,没过期直接用,过期了去服务器看看本地这个缓存还能不能用,能用就接着用(返回304状态码)。不能用就请求最新的(返回200状态码)。

协商缓存HTTP Code : 304
服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;
在这里插入图片描述
协商缓存HTTP Code : 200
浏览器首次请求,本地没有缓存可用。去服务器请求缓存,得到200的响应
在这里插入图片描述


浏览器针对协商缓存判断流程

在这里插入图片描述

比如Get请求JS文件,请求头中会加入属性:Last-Modified/If-Modified-Since或者ETag/If-None-Match

Last-Modifed/If-Modified-Since和Etag/If-None-Match是分别成对出现的,呈一一对应关系

之所以会有这两种属性,是因为前者是HTTP 1.0版本的,后者是HTTP 1.1版本出现的

这两个都是用来判断文件是否需要更新的时间戳或者hash值,服务器收到请求后,根据这两个属性进行判断,如果请求的文件没有更新,那么就返回HTTP304的状态码,让浏览器直接用缓存(Disk or Menmory)。而是否追加这个属性,由浏览器自行判断

在这里插入图片描述

但一般像是Ajax的Get、Post(类似这种的XHR)等,如果浏览器后端利用代码明确设置了Cache-Control:no-cache的选项,则不会缓存数据,到了服务端就重新请求数据

也就是no-cache的情况下,必须到服务器进行check,当服务器返回304的时候,才允许使用浏览器缓存,否则必须请求新数据

在这里插入图片描述

注意:ETag的优先级是优于 Last-Modified&If-Modified-Since,如果校验Header是ETag+If-None-Match的情况下,就会优先验证ETag的Hash值

如何选择合适的缓存?

大致的顺序

  • Cache-Control —— 请求服务器之前
  • Expires —— 请求服务器之前
  • If-None-Match (Etag) —— 请求服务器
  • If-Modified-Since (Last-Modified) —— 请求服务器
    协商缓存需要配合强缓存使用,如果不启用强缓存的话,协商缓存根本没有意义

大部分web服务器都默认开启协商缓存,而且是同时启用【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】

但是下面的场景需要注意:

  • 分布式系统里多台机器间文件的Last-Modified必须保持一致,以免负载均衡到不同机器导致比对失败;
  • 分布式系统尽量关闭掉ETag(每台机器生成的ETag都会不一样);

CDN缓存参考:https://blog.csdn.net/Runnymmede/article/details/138315636
参考文章1:https://juejin.cn/post/6844904153043435533
参考文章2:https://juejin.cn/post/6844903838768431118
参考文章3:https://github.com/amandakelake/blog/issues/41
参考文章4:https://segmentfault.com/a/1190000008956069

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

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

相关文章

(蓝桥杯C/C++)——常用库函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、 二分查找 1.二分查找的前提 2.binary_ search函数 3.lower_bound和upper_bound 二、排序 1.sort概念 2.sort的用法 3.自定义比较函数 三、全排列 1.next p…

Spring Boot⾃动配置

一、Spring Boot的自动配置原理 Spring Boot使用一种称为“约定优于配置”的方法,这意味着如果你按照预定的方式来安排你的代码和依赖项,Spring Boot可以自动配置你的应用程序。主要特点包括: 自动检测:Spring Boot在应用启动时…

C#实现word和pdf格式互转

1、word转pdf 使用nuget: Microsoft.Office.Interop.Word winform页面: 后端代码: //using Spire.Doc; //using Spire.Pdf; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Sy…

iOS Swift5算法恢复——HMAC

demangle的时候看到了CryptoSwift,HMAC,于是写一个helloworld,用于对照。 sudo gem install cocoapods pod init pods文件,注意要标注静态链接: # Uncomment the next line to define a global platform for your p…

Diving into the HAL-----HAL_GPIO

1、怎么看待外设: 从总线连接的角度看,外设和Core、DMA通过总线交换数据,正所谓要想富先修路。要注意,这些总线中的每一个都连接到不同的时钟源,这些时钟源决定了连接到该总线的外设操作的最大速度。 从内存分配的角度…

C#与C++交互开发系列(十六):使用多线程

前言 在开发需要高性能的应用程序时,多线程是提升处理效率和响应速度的关键技术。C 和 C# 各自拥有不同的线程模型和并发工具。在跨语言开发中,如何有效地利用两者的并发特性,同时确保线程安全和数据一致性,是一个值得探讨的问题…

libavdevice.so.58: cannot open shared object file: No such file ordirectory踩坑

博主是将大图切分成小图时遇到 问题一、linux编译后,找不到ffmpeg中的一个文件 产生原因,各种包集成,然后安装以后乱七八糟,甚至官方的教程也不规范导致没有添加路径到系统文件导致系统执行的时候找不到 1.下载 博主进行的离线…

查询使用方法:

模糊查询: 查询某一列中内容为空的记录。 -- 模糊查询 (项目中尽量不要使用) -- 张x SELECT * FROM student WHERE student_name LIKE 张_; -- % 不限长度的字符 -- 手机号中有 23 0或多个 SELECT * FROM student WHERE phone LIKE %23% -- 名字包含铮的学生 SELEC…

数据结构与算法分析——你真的理解查找算法吗——基于散列的查找(代码详解+万字长文)

一、算法描述 前面讨论的查找算法在处理小数据量(顺序查找)或者有序的数据集合(二分查找)时才使用。我们需要更加强大的算法能够查找较大的集合,而且并不需要有序。最常使用的一个方法是使用散列函数来将目标元素的一个或者多个特征转换成一个值,这个值用来索引一个已经索引的…

密码管理工具实现

该文档详细描述了实现一个简单的密码管理工具的过程,工具基于PHP和MySQL构建,支持用户注册、密码存储、管理以及角色权限控制等核心功能。 系统架构设计 技术栈:PHP(后端逻辑)、MySQL(数据存储&#xff09…

深度学习(七)深度强化学习:融合创新的智能之路(7/10)

一、深度强化学习的崛起 深度强化学习在人工智能领域的重要地位 深度强化学习作为一种融合了深度学习和强化学习的新技术,在人工智能领域占据着至关重要的地位。它结合了深度学习强大的感知能力和强化学习优秀的决策能力,能够处理复杂的任务和环境。例如…

基于 Java 的 Spring Boot 和 Vue 的宠物领养系统设计与实现

需要代码 vx:Java980320 不收取任何费用 在这个宠物领养系统中,我们可以设定两个角色:管理员和普通用户。每个角色的功能和目标略有不同,以下分别介绍: 管理员 管理员的主要职责是确保平台的高效运行&#xff0c…

PythonBase01

将理论,代码,图示三合一。 day1计算机基础结构 硬件 1944年,美籍匈牙利数学家冯诺依曼提出计算机基本结构。 五大组成部分:运算器、控制器、存储器、输入设备、输出设备。 – 运算器:按照程序中的指令&#xff0c…

APISQL企业版离线部署教程

针对政务、国企、医院、军工等内网物理隔离的客户,有时需要多次摆渡才能到达要安装软件的服务器。本教程将指导您使用Linux和Docker Compose编排服务,实现APISQL的离线部署。 准备 准备一台Linux(x86_64)服务器。 安装Docker Engine(推荐版本…

【01初识】-初识 RabbitMQ

目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用?小结:同步调用优缺点 1-2 异步调用什么是异步调用?小结:异步调用的优缺点,什么时候使用异步调用? 1-3 MQ 技术选型 学习背景 异步通讯的特点&#xff…

记录一次mmpretrain训练数据并转onnx推理

目录 1.前言 2.代码 3.数据形态【分类用】 4.配置文件 5.训练 6.测试-分析-混淆矩阵等等,测试图片效果等 7.导出onnx 8.onnx推理 9.docker环境简单补充 1.前言 好久没有做图像分类了,于是想用商汤的mmclassification快速搞一波,发现已…

【微服务】Nacos 注册中心

<!-- nacos 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${nacos.version}</version><type>pom</type><scope>import&l…

太速科技-430-基于RFSOC的8路5G ADC和8路10G的DAC PCIe卡

430-基于RFSOC的8路5G ADC和8路10G的DAC PCIe卡 一、板卡概述 板卡使用Xilinx的第三代RFSOC系列&#xff0c;单颗芯片包含8路ADC和DAC&#xff0c;64-bit Cortex A53系列4核CPU&#xff0c;Cortex-R5F实时处理核&#xff0c;以及大容量FPGA。 对主机接口采用PCIe Gen3x…

大文件秒传,分片上传,断点续传

大文件分片上传 一 功能描述 1.文件通过web端分片多线程上传到服务端&#xff0c;然后web端发起分片合并&#xff0c;完成大文件分片上传功能 2.上传过的大文件&#xff0c;实现秒传 3.上传过程中&#xff0c;服务异常退出&#xff0c;实现断点续传 二 流程图 三 代码运行…

数据库数据恢复—Oracle ASM磁盘组掉线 ,ASM实例无法挂载的数据恢复案例

Oracle数据库数据恢复环境&故障&#xff1a; Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 &#xff0c;ASM实例不能mount。 Oracle数据库故障分析&恢复方案&#xff1a; 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储…