全面解读 HTTP 缓存机制:200 内存与硬盘缓存、304 状态码

news2024/9/21 1:28:51

更多内容:孔乙己大叔

        在探讨网页性能优化时,HTTP 缓存机制是不可或缺的一环。它不仅能够减少数据传输量,降低带宽消耗,还能显著提升网页的加载速度和用户体验。本文将深入解析 HTTP 状态码 200 和 304 在缓存机制中的作用,并通过 Nginx 的配置示例展示如何实现高效的静态资源缓存。

一、HTTP 状态码 200 与缓存机制

        HTTP 状态码 200(OK)是 HTTP 协议中最常见的成功响应代码,表示服务器成功处理了请求,并返回了所请求的资源。在缓存机制的上下文中,HTTP 状态码 200 涉及多种资源加载方式,包括首次请求、内存缓存和磁盘缓存。

1.1 HTTP 状态码 200 详解

1. 请求成功

        当浏览器首次请求某个资源时,如加载一个网页、图片或其他文件,服务器会返回 200 状态码,表示资源已成功传输且没有问题。例如,打开一个新的网页时,浏览器会向服务器请求 HTML、CSS 和 JavaScript 文件,服务器返回 200 状态码并传输这些文件,浏览器进行渲染以显示网页内容。

2. 内存缓存

        资源成功请求并返回 200 状态码后,浏览器会将这些资源存储在内存缓存中。内存缓存的优点在于速度快,能够迅速响应用户的请求,适合存储需要频繁访问的资源。然而,其缺点是内容在浏览器关闭或页面刷新后会被清除,因此适用于会话期间需要频繁访问的资源。

        例如,访问新闻网站的首页时,其中包含多张图片和样式表。点击新闻链接切换到详细页面时,浏览器会利用内存缓存中的图片和样式表来加速页面加载。

3. 磁盘缓存

        除了内存缓存,浏览器还会将资源存储在磁盘缓存中。磁盘缓存的优点在于可以长期保存资源,减少带宽消耗,但访问速度比内存缓存慢。因此,磁盘缓存适合存储长期需要保留的资源,如图片、样式表和脚本文件等。

        例如,访问购物网站并下载商品图片和样式表后,这些资源会被存储在磁盘缓存中。即使关闭浏览器后重新访问该网站,浏览器也会从磁盘缓存中读取这些资源,加快页面显示速度。

1.2 HTTP 状态码 200 与服务器交互情况

        在浏览器加载资源的过程中,HTTP 状态码 200 表示资源已成功从服务器获取。具体交互情况如下:

1. 首次请求

        浏览器首次请求资源时,由于缓存中不存在该资源,浏览器会向服务器发送 HTTP 请求。服务器处理请求后返回 200 状态码和资源,完成一次完整的 HTTP 请求-响应循环。

2. 内存缓存

        在同一会话期间再次请求相同资源时,浏览器会首先检查内存缓存。如果资源在内存缓存中,浏览器将直接从内存中加载资源,无需与服务器交互。这种方式访问速度非常快,因为内存缓存存储在 RAM 中。

3. 磁盘缓存

                如果资源不在内存缓存中,浏览器会继续检查磁盘缓存。如果资源存在于磁盘缓存中,浏览器会直接从磁盘中加载资源,同样无需与服务器交互。磁盘缓存的访问速度虽然比内存缓存慢,但能够长期保存资源,减少重复下载。

4. 与服务器交互的区别

在首次请求中,浏览器必须与服务器交互以获取资源。在内存缓存和磁盘缓存的情况下,浏览器则直接从本地缓存中加载资源,无需与服务器交互。但如果资源在缓存中不存在或已过期,浏览器仍需与服务器交互以重新获取资源。此时,服务器可能返回 200 状态码(资源需重新传输)或 304 状态码(资源未修改)。

二、HTTP 状态码 304 与缓存机制

        HTTP 状态码 304(Not Modified)表示资源未修改,即所请求的资源自上次请求以来没有发生任何变化。这种状态码与浏览器的缓存机制密切相关,通过减少不必要的数据传输来提升性能。

2.1 HTTP 状态码 304 基本概念

        HTTP 状态码 304 是一种重定向状态码,但它并不真正重定向到另一个资源。相反,它告诉客户端可以继续使用其本地缓存的副本,因为服务器上的资源自上次请求以来没有变化。这减少了带宽消耗,提升了加载速度。

2.2 HTTP 状态码 304 的缓存机制

        当浏览器请求某个资源时,它会检查本地缓存中是否有该资源的副本。如果有,并且资源未过期,浏览器将直接使用缓存资源;如果已过期,浏览器需要向服务器确认资源是否有更新。

浏览器通过发送带有验证信息的请求(如 ETag 或 Last-Modified)来向服务器确认资源状态。服务器根据这些验证信息判断资源是否发生了变化:

  • ETag:由服务器生成的资源唯一标识符,通常是一个哈希值或唯一标识符,用于标记资源的版本。浏览器在请求中通过 If-None-Match 头字段发送 ETag 值,服务器将请求中的 ETag 值与当前资源的 ETag 值进行比较。
  • Last-Modified:表示服务器上资源的最后修改时间。浏览器在请求中通过 If-Modified-Since 头字段发送 Last-Modified 时间戳,服务器会比较请求中的时间戳与资源的实际最后修改时间。

服务器根据比较结果作出响应:

  • 如果资源未改变,服务器返回 304 状态码,不包含任何消息体。浏览器从本地缓存加载资源并渲染页面。
  • 如果资源已改变,服务器返回 200 状态码和更新后的资源内容。浏览器更新缓存并渲染新资源。
2.3 完整的工作流程

以下是 HTTP 状态码 304 缓存机制的完整工作流程:

  1. 浏览器请求资源。
  2. 浏览器检查本地缓存中是否有该资源的副本。
  3. 如果资源在缓存中且未过期,浏览器直接使用缓存资源。
  4. 如果资源已过期,浏览器向服务器发送带有验证信息的请求(ETag 或 Last-Modified)。
  5. 服务器根据验证信息判断资源是否发生变化。
  6. 如果资源未改变,服务器返回 304 状态码,浏览器从缓存加载资源。
  7. 如果资源已改变,服务器返回 200 状态码和更新后的资源,浏览器更新缓存并渲染新资源。
2.4 缓存机制的优势

HTTP 状态码 304 的缓存机制具有以下优势:

  • 减少带宽使用:未修改的资源不会重复下载,降低了带宽消耗。
  • 提高加载速度:浏览器可以直接从本地缓存中加载资源,提升了网页的加载速度。
  • 减轻服务器负担:减少了服务器处理请求的频率和数据传输量,提高了服务器的处理效率。
孔乙己大叔您的一站式代码技术资源中心。我们汇集了各种编程语言的教程、最佳实践和行业解决方案,帮助您轻松掌握最新技术。此外,我们还提供了一系列实用的开发者工具和代码库,助您提升开发效率。立即访问,探索更多精彩内容!icon-default.png?t=N7T8http://www.rebootvip.com/

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

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

相关文章

不懂就问,净水器到底过滤了什么?

在水质问题日益受到关注的今天,净水器已成为许多家庭的必备品。然而,对于净水器究竟能够过滤掉多少脏东西,很多人可能并不十分清楚。 净水器的核心功能是去除水中的杂质和有害物质,确保我们饮用的水更加安全和健康。这就如同我们…

【kafka】在Linux系统中部署配置Kafka的详细用法教程分享

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

零工市场 Java 版源码开发:开启灵活就业新潮流

现如今,数字化经济发展的越来越迅速,那么灵活就业的方式也就更加受到大众的青睐。其中,零工市场的兴起为求职者和招聘方提供了更加便捷、高效的对接平台。 系统概述 零工市场系统是一个连接求职者和招聘方的在线平台,主要功能包…

Carmeker C接口

本文主要是简单介绍如何将C代码的模型嵌入到carmaker中运行 一.项目创建与例程生成 在创建项目的时候勾选source选项,勾选后才能在项目目录下生成src的文件夹 在src文件夹下,存在大量IPG的例程,这些例程简单介绍了如何使用了src的接口 编译…

递归 与 dfs 综合练习(四)

目录 一、单词搜索 1.题目链接:79. 单词搜索 2.题目描述: 3.解法 🌴算法思路: 🌴算法代码: 一、黄金矿工 1.题目链接:1219. 黄金矿工 2.题目描述: 3.解法 🌴算…

《从C/C++到Java入门指南》- 25.final 关键字

final 关键字 final 变量 final变量可以理解为C中的const,变量一经定义无法修改。 public class Main {public static void main(String args[]) {final double PI 3.1415926;System.out.println(PI);// PI 3.14; // 尝试修改会报错} }final 方法 一个定义为f…

私有仓库

创建私有仓库,在企业中分享项⽬ # 创建仓库 # 重启docker服务 # 为要上传的镜像添加标记 1.拉取registry 2.创建挂载⽬录 3.启动容器,映射端⼝,挂载⽬录 4.访问仓库 5.配置pull和push,修改daemon.json 6.修改了配置⽂件,重启docke…

WordPress资源产品展示类主题 官网主题 CeoNova-Pro_v4.4

WordPress资源产品展示类主题 官网主题 CeoNova-Pro_v4.4 开心版 CeoNova-Pro主题是一款轻量级、且简洁大气、产品官网类主题,定位于高端产品官网、同时包含了知识付费、定制服务、问答社区、论坛交流、网址导航、以及付费产品购买下载等全方位覆盖。 CeoNova主题…

C#和数据类型转换

C#是一种强类型语言,这意味着每个变量的类型在编译时都是已知的。数据类型转换是指将一种数据类型的值转换为另一种数据类型的过程。在C#中,数据类型转换分为隐式转换和显式转换。本文将详细探讨这两种转换方式,并提供字符转16进制的解决方案…

除尘雾炮机的寿命一般是多久呢,需要维护吗

除尘雾炮机的寿命一般是5-10年左右,但具体寿命会受到设备质量、使用环境、使用频率及维护保养情况等多种因素的影响。朗观视觉小编接下来带您扒一扒! 除尘雾炮机的寿命影响因素 设备质量:高质量的雾炮机采用优质材料和先进工艺制造&#xff…

自动化数据汇总:使用Python从多个数据源汇总数据

目录 引言 一、理论基础 1.1 数据源介绍 1.2 数据处理流程 1.3 常用库介绍 二、实践操作 2.1 数据读取 2.1.1 从CSV文件读取数据 2.1.2 从Excel文件读取数据 2.1.3 从数据库读取数据 2.2 数据处理 2.2.1 数据合并 2.3 数据汇总 2.4 数据存储 2.4.1 存储到CSV文件…

深度解析MFT损坏:原因、恢复策略与预防措施

一、MFT损坏现象揭秘 在Windows操作系统中,主文件表(Master File Table,简称MFT)是NTFS文件系统的核心组成部分,它记录了文件系统中所有文件的元数据,包括文件名、大小、创建和修改时间、数据位置等关键信…

【Spring】获取cookie,session,header(3)

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 目录 本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。…

ARM————体系结构

1、ARM结构框架 RAM:随机存储,存储速度快,掉电数据丢失SRAM 静态存储DRAM 动态存储SDRAM 同步存储DDR 双倍速率同步存储ROM:只读存储,存储速度慢,掉电不丢失数据PROM 可编程存储EPROM 可擦…

eureka一

Eureka 什么是eureka eureka服务调用流程 springcloud技术栈应用 分布式理论 CAP CAP理想运行情况 CAP不理想运行情况 CAP取舍 BASE BASE原理 搭建单机注册中心 服务提供者 服务消费者 集群服务注册中心 eureka功能详解 核心功能演示 Eureka源码解析 lifecycle的start

0基础轻松玩转.NET Web API 8.0【CICD】项目实战

1.背景 最近在学习CI/CD,为了加快熟悉CI/CD,我实操了下基于.Net 8.0的CI/CD项目实战。Ci/CD就是自动化作业,实现项目自动编译、发布、执行等,也有用于拉取推送数据的场景。本文主要介绍了在win 11下搭建CI/CD,实现自动…

【JS】事件捕获和事件冒泡的区别

事件捕获和事件冒泡是指在 DOM 树中处理事件时的两种不同的传播方式。它们之间的主要区别在于事件传播的方向和顺序: 事件捕获(Capture) 方向: 从最外层的祖先元素向目标元素传播。顺序: 事件首先从最外层的祖先元素…

【C++ 面试 - STL】每日 3 题(四)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

[A-08]ARMv8/ARMv9-Memory-内存空间(动态内存控制器与物理内存设备)

ver0.2 更多精彩内容,请关注微信公众号 # 前言 前序的文章中,已经讲解了ARM架构下管理内存的核心组件MMU的相关背景知识。MMU需要借助页表(Translation Table)衔接起虚拟地址空间和物理内存的空间,实现在一个硬件环境下软件任务的并发执行效…

【不安全的集合类】同步容器(如ConcurrentHashMap)、并发集合(如CopyOnWriteArrayList)

文章目录 一、List的线程不安全二、Set的线程不安全三、Map的线程不安全 日常我们用到的集合的情况会很多,在单线程的情况下,不用考虑到线程安全的问题,但是如果在多线程开发的过程中,我们该选择哪一种类型来保证线程安全性呢 &am…