一文搞懂浏览器缓存机制

文章目录

    • 概述
    • 强制缓存
    • 协商缓存
    • 总结
    • 参考文章

概述

浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的

浏览器第一次向服务器发送HTTP请求, 浏览器拿到请求结果后,会根据响应报文的缓存标识,决定是否进行缓存。

我们可以看出

  1. 浏览器每次发送请求,都会先在浏览器中查找该请求的结果以及缓存标识
  2. 浏览器每次拿到结果都会将该结果和缓存标识存入浏览器缓存之中

我们根据是否向服务端再次发起HTTP请求和缓存过程分为两个部分,分别是强制缓存和协商缓存

我们先做一下简单解释:

  • 🌊强制缓存就是向浏览器缓存查找结果,并根据该结果的缓存规则来决定是否使用该缓存的结果
  • 🌊协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程

强制缓存

场景

  1. 不存在该缓存结果和缓存标识,强制缓存失效,则直接向服务器发起请求(跟第一次发起请求一致)
  2. 存在该缓存结果和缓存标识,但该结果已失效,强制缓存失效
  3. 存在该缓存结果和缓存标识,且该结果尚未失效,强制缓存生效

注意:场景在总结图中有体现

相关字段

  • Expires
    Expires是HTTP/1.0控制网页缓存的字段,其值为服务器返回该请求结果缓存的到期时间,即再次发起该请求时,如果客户端的时间小于Expires的值时,直接使用缓存结果
  • Cache-Control
    在HTTP/1.1中,Cache-Control是最重要的规则,主要用于控制网页缓存,主要取值为
    - public:所有内容都将被缓存(客户端和代理服务器都可缓存)
    - private:所有内容只有客户端可以缓存,Cache-Control的默认取值
    - no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
    - no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存
    - max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效

拓展:内容缓存

我们需要了解内存缓存(from memory cache)和硬盘缓存(from disk cache),如下:

  1. 内存缓存(from memory cache):内存缓存具有两个特点,分别是快速读取和时效性:
  2. 快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取。
  3. 时效性:一旦该进程关闭,则该进程的内存则会清空。
  4. 硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。

在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(from memory cache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)。

协商缓存

协商缓存失效,返回304

场景

  1. 协商缓存生效,返回304
    发送请求,浏览器缓存失效,会再向服务端发送请求,服务端进行返回结果,将请求结果和缓存标识存入浏览器中
  2. 协商缓存失效,返回200和请求结果结果
    与上面不同的是,服务端发现该资源没有变化,返回304,会继续向浏览器缓存获取结果(怎么发现该资源是否有变化,可以参考下面的相关字段Etag / If-None-Match)

注意:场景在总结图中有体现

相关字段

  • Last-Modified / If-Modified-Since
    Last-Modified是服务器响应请求时,返回该资源文件在服务器最后被修改的时间
  • Etag / If-None-Match
    Etag是服务器响应请求时,返回当前资源文件的一个唯一标识
    If-None-Match是客户端再次发起该请求时,携带上次请求返回的唯一标识Etag值,通过此字段值告诉服务器该资源上次请求返回的唯一标识值。服务器收到该请求后,发现该请求头中含有If-None-Match,则会根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件;不一致则重新返回资源文件,状态码为200

总结

强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,重新获取请求结果,再存入浏览器缓存中;生效则返回304,继续使用缓存

在这里插入图片描述

参考文章

彻底理解浏览器的缓存机制

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

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

相关文章

机器学习:数据处理基操

在处理完数据之后,选择好模型,就可以用训练集训练模型,用测试集输入模型 然后输出需要预测的结果啦~ 一、模块导入 import numpy as np import pandas as pd #读入数据 二、pandas数据 一、dataframe基础 一、dataframe的创建…

github新手使用详解及环境搭建案例

对于 GitHub 的新手使用以及环境搭建,以下是详细的步骤和案例: 一、GitHub 新手使用详解 注册 GitHub 账号:首先,你需要在 GitHub 官网上注册一个账号。填写必要的个人信息,如用户名、邮箱和密码等。注册完成后&…

【代码】Android|判断asserts下的文件存在与否,以及普通文件存在与否

作者版本:Android 11及以上 主要是发现网上没有完整的、能跑的代码,不知道怎么回事,GPT给我重写的。我只能保证这个代码尊嘟能跑,不像其他的缺胳膊少腿的。 asserts 贴一下结果: boolean isAssertFileExists(String …

Nginx配置php起WoWSimpleRegistration服务

WoWSimpleRegistration服务的git地址: GitHub - TrinityCore/WoWSimpleRegistration: Simple Registration page for TrinityCore/AzerothCore/AshamaneCore/CMangos 下载WoWSimpleRegistration 首先git下载: git clone https://github.com/TrinityC…

kafka消费者接收不到消息

背景: 对kafka消息进行监听,生产者发了消息,但是消费端没有接到消息,监听代码 消费端,kafka配置 spring.kafka.bootstrap-serverskafka.cestc.dmp:9591 spring.kafka.properties.sasl.jaas.configorg.apache.kafka.…

29.HarmonyOS App(JAVA)通知

普通通知: 通知渠道,弹出消息后,自动消失 长文本通知 //多行文本通知 //图片通知 //社交通知 //媒体通知--经测试,图片无法显示,文字不显示 场景介绍 HarmonyOS提供了通知功能,即在一个应用的UI界面之外显示的消息,主…

C++之结构体以及通讯录管理系统

1,结构体基本概念 结构体属于自定义的数据概念,允许用户存储不同的数据类型 2,结构体的定义和使用 语法:struct 结构体名{ 结构体成员列表}; 通过结构体创建变量的方式有三种: 1,struct …

【简说八股】面试官:你知道什么是AOP么?

回答 AOP(Aspect-Oriented Programming),即面向切面编程,是一种编程范式,它的主要思想是将应用程序中的横切关注点(如日志记录、性能统计、安全控制等)从业务逻辑中剥离出来,然后通过特殊的方式将这些横切…

设计模式学习笔记 - 设计原则 - 8.迪米特法则(LOD)

前言 迪米特法则,是一个非常实用的原则。利用这个原则,可以帮我们实现代码的 “高内聚、松耦合”。 围绕下面几个问题,来学习迪米特原则。 什么是 “高内聚、松耦合”?如何利用迪米特法则来实现 高内聚、松耦合?哪些…

程序员求职

程序员的金三银四求职宝典 随着春天的脚步渐近,对于许多程序员来说,一年中最繁忙、最重要的面试季节也随之而来。金三银四,即三月和四月,被广大程序员视为求职的黄金时期。在这两个月里,各大公司纷纷开放招聘&#xf…

技术实践|百度安全「大模型内容安全」高级攻击风险评测

1、引子 2023年10月16日,OWASP发布了《OWASP Top 10 for LLM Applications》,这对于新兴的大语言模型安全领域,可谓一份纲领性的重要报告。 OWASP是开放式Web应用程序安全项目(Open Web Application Security Project&#xff0…

【Linux网络命令系列】ping curl telnet三剑客

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【C++】vector的使用和模拟实现(超级详解!!!!)

文章目录 前言1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 空间增长问题1.2.3 vector 增删查改1.2.4 vector 迭代器失效问题。(重点!!!!!!)1.2.5 vector 在OJ中有关的练习题 2.ve…

C++入门和基础

目录 文章目录 前言 一、C关键字 二、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.3 标准命名空间 三、C输入&输出 四、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的分类 五、函数重载 5.1 函数重载的简介 5.2 函数重载的分类 六、引用 6.1 引用的…

搭建个人IC_EDA服务器(物理机)一:安装Centos7

1.准备 大于8G的U盘;待装的电脑,我使用淘汰的在大学时候使用的笔记本;U盘启动器制作工具:UltralSo;官网下载的在没有付费的情况下,即使试用期,安装的时候会有莫名的问题,建议使用这…

【接口测试】常见HTTP面试题

目录 HTTP GET 和 POST 的区别 GET 和 POST 方法都是安全和幂等的吗 接口幂等实现方式 说说 post 请求的几种参数格式是什么样的? HTTP特性 HTTP(1.1) 的优点有哪些? HTTP(1.1) 的缺点有哪些&#x…

全量知识系统问题及SmartChat给出的答复 之14 解析器+DDD+文法型 之2

Q36. 知识系统中设计的三种文法解析器和设计模式之间的关系 进一步,我想将 知识系统中设计的三种语言(形式语言、人工语言和自然)的文法解析器和DDD中的三种程序类型(领域模型、领域实体和领域服务) 形式语言文法 我…

动态代理总结

Java 代理模式 使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能 静态代理 静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件…

MQ如何防止消息被重复消费?

被询问如何防止MQ消息被重复消费时,其实是在考察候选人对消息队列、分布式系统设计以及容错机制的理解,通过这些问题,可以全面了解候选人在处理MQ消息重复消费问题时的思考方式、技术能力和实践经验,从而评估其是否适合担任相关岗…

Puzzles

题目链接:Submit - Codeforces​​​​​​ 解题思路: 题目大概意思就是在一个数组里找n个数里的最大值减最小值的最小值,先排序,然后将第i n - 1项减去第i项与最小值作比较,输出最小值即可,注意循环结束…