6.浏览器缓存

上一篇👉: 浏览器存储

浏览器缓存

文章目录

  • 浏览器缓存
    • 1. 浏览器缓存机制的理解
      • 初次加载资源
      • 强制缓存阶段
      • 协商缓存阶段
      • 服务器响应
      • 版本控制策略
    • 2 浏览器资源缓存的位置
      • Service Worker缓存
      • Memory Cache(内存缓存)
      • Disk Cache(磁盘缓存)
      • Push Cache(推送缓存)(HTTP/2特性)
    • 3. 协商缓存和强缓存的区别
      • 强缓存(本地缓存)
      • 协商缓存
      • 总结对比
    • 为何浏览器缓存至关重要?
    • 浏览器刷新行为对比
      • 总结
      • 刷新行为对比概览
      • 总结

1. 浏览器缓存机制的理解

浏览器缓存机制是网页性能优化的核心组件之一,通过存储重复使用的资源来加速页面加载速度,减少网络请求次数

初次加载资源

  • 首次请求:当浏览器首次请求某个资源时(如HTML、CSS、JavaScript文件或图片),服务器会返回该资源,并在响应头中附带缓存相关的指令,如Cache-Control(推荐用于HTTP/1.1)和Expires(适用于HTTP/1.0)。Cache-Control可能包含max-age=来指示资源在客户端可缓存的最大时间长度,而Expires则直接指定资源何时过期的日期时间。

强制缓存阶段

  • 资源存储: 浏览器接收到资源后,会将其存储在本地缓存中,并记住相应的缓存策略(Cache-Control或Expires)。
  • 后续请求处理: 下次请求相同的资源时,浏览器首先检查资源是否还在其缓存的有效期内。如果在有效期内(即没有“过期”),浏览器直接从本地缓存中加载资源,无需再次向服务器发起请求,这便是强制缓存生效的体现。

协商缓存阶段

  • 资源过期: 如果发现资源已过期,浏览器不会立即丢弃缓存,而是进入协商缓存阶段,尝试确认资源是否真的需要更新。

  • 发送验证请求: 浏览器发送一个包含If-None-Match(基于ETag验证)或If-Modified-Since(基于Last-Modified时间验证)的请求头的HTTP请求到服务器。

  • If-None-Match: 包含之前响应中的ETag值,用于精确匹配服务器上的资源版本。

  • If-Modified-Since: 包含上次请求时服务器返回的资源最后修改时间。

服务器响应

  • 资源未修改: 如果服务器判断资源未发生改变(通过ETag或Last-Modified验证),则返回一个HTTP状态码304(Not Modified),指示浏览器可以继续使用本地缓存的副本。

  • 源已修改: 若资源有所更新,服务器则返回一个新的资源实体,并附带新的ETag或Last-Modified,以及新的Cache-Control或Expires策略,状态码为200(OK)。

版本控制策略

  • 资源版本标记: 为避免用户因浏览器缓存而未能获取到最新的资源,开发人员常在资源URL后附加版本号(如filename.js?v=2.1),即便资源内容未变,也能迫使浏览器请求服务器获取新资源,确保用户始终访问到的是最新版本。
304 未修改
200 OK 新资源
初始请求
资源是否缓存且未过期?
向服务器发送请求
使用本地缓存资源
服务器响应
使用本地缓存资源
存储新资源至缓存并使用

通过上述流程,浏览器缓存机制有效地平衡了性能优化与资源更新的需求,确保了网页加载的高效性和内容的新鲜度

2 浏览器资源缓存的位置

浏览器资源缓存分布在四个主要位置,按照访问和使用优先级排列如下:

Service Worker缓存

  • 特性:Service Worker运行在浏览器主线程之外,赋予开发者对缓存前所未有的控制力。它允许自定义缓存策略,包括选择缓存哪些文件、如何匹配及读取缓存。Service Worker缓存具有持续性,除非主动清理否则一直有效。当Service Worker未找到缓存内容时,会通过fetch请求数据,但不论数据实际来源(Memory Cache、Disk Cache或网络),浏览器呈现时均表现为通过Service Worker获取。

Memory Cache(内存缓存)

  • 特性:Memory Cache提供了最快的访问速度,因为它直接存储在内存中。然而,这种高速度伴随着短暂的生命周期,一旦浏览器标签页关闭,内存中的缓存随之释放。

Disk Cache(磁盘缓存)

  • 特性:Disk Cache存储于硬盘上,相较于Memory Cache,读取速度稍慢,但胜在容量大、持久性强。根据HTTP响应头中的指令,Disk Cache确定资源的缓存策略,能长期存储资源,甚至跨浏览会话。它是浏览器缓存体系中最广泛使用的一种形式。

Push Cache(推送缓存)(HTTP/2特性)

特性:

  • 仅当上述三种缓存均未命中时启用。
  • 缓存时间有限,局限于当前会话,会话结束即失效。
  • 支持服务器主动推送资源到客户端,所有类型的资源均可推送,但Edge和Safari浏览器兼容性不佳。
  • 即便资源设置了no-cache或no-store,仍可被推送。
  • 连接关闭时,Push Cache被清除。
  • 共享HTTP/2连接的多个页面可复用相同缓存。
  • 推送的缓存项仅能被使用一次。
  • 浏览器可拒绝已存在的资源推送,避免冗余。
  • 支持跨域推送资源。

3. 协商缓存和强缓存的区别

类型目标设置方式行为关键点
强缓存(本地缓存)无需与服务器通信直接使用缓存资源- Cache-Control: max-age=<seconds>
- Expires: <date>
有效期內,直接使用本地缓存,无网络请求加载速度快,减少网络请求
协商缓存先询问服务器资源是否变更再决定是否使用缓存- 响应头: ETag, Last-Modified
- 请求头: If-None-Match, If-Modified-Since
浏览器询问服务器,根据服务器响应决定使用缓存或获取新资源确保内容最新,减少数据传输
总结对比
差异 :强缓存避免额外请求,协商缓存至少一次验证请求
协同作用 :先尝试强缓存,失败则协商缓存
策略运用 :根据资源特性灵活选择或组合使用策略开发者可设计更优缓存策略,提升用户体验和性能

强缓存(本地缓存)

  • 目标:使浏览器能够在不与服务器通信的情况下直接利用缓存资源。

  • 设置方式

    • Cache-Control:响应头字段,提供更多控制选项,如max-age=<seconds>定义资源的有效时间。
    • Expires:响应头字段,指定资源过期的具体日期时间,但可能受客户端时间不同步的影响。
  • 行为:如果资源在有效期内,浏览器不会发送请求到服务器,直接使用本地缓存。

  • 关键点:提高加载速度,减少网络请求。

协商缓存

  • 目标:在不确定资源是否已更新时,先询问服务器资源是否变更,再决定是否使用缓存。

  • 设置方式:利用响应头的 ETag 或 Last-Modified,以及请求头的 If-None-Match 或 If-Modified-Since。

    • ETag 是资源的唯一标识符,比基于时间的 Last-Modified 更精确。
    • Last-Modified 标记资源最后修改时间,但精度有限。
  • 行为:浏览器发送请求到服务器检查资源是否更新,服务器通过这些标识符判断是否返回“304 Not Modified”让浏览器继续使用缓存,或者返回新资源。

  • 关键点:确保内容最新,同时减少不必要的数据传输。

总结对比

  • 差异:强缓存完全避免了额外的网络请求,而协商缓准则至少会发起一个验证请求
  • 协同作用:两者共同作用,先尝试使用强缓存,失败后再通过协商缓存机制决定是否使用缓存副本。
  • 策略运用:开发者可以根据资源的更新频率和重要性灵活选择或结合使用这两种缓存策略,以达到最佳的性能优化效果。理解这两者的机制和差异,可以帮助开发者更好地设计网站的缓存策略,从而提升用户体验和网站性能。

为何浏览器缓存至关重要?

浏览器缓存的存在主要是为了优化网页加载速度和提升整体网站性能,尤其针对于频繁使用的前端静态资源,如HTML、CSS、JavaScript文件、图像等。

  • 核心目的: 器缓存的核心在于复用已下载的资源。首次访问某个网页时,相关资源会被下载并存储在用户的本地计算机上。当用户再次访问同一页面或具有相同资源的其他页面时,浏览器优先检查本地缓存,如果资源未发生变化,则直接从缓存加载,避免了重新向服务器发起请求的过程。
  • 减少服务器负担,提升性能: 通过缓存静态资源,服务器不必为同一资源的重复请求持续提供服务,显著降低了服务器的工作压力,提升了处理其他请求的能力,进而提高了整个网站的响应速度和服务能力。
  • 加速客户端加载速度: 本地加载资源比从网络获取要快得多,因为避免了网络延迟和传输时间。这直接转化为更快的页面加载时间,为用户提供更加流畅的浏览体验。
  • 减少网络数据传输: 频繁重用缓存资源,极大减少了通过网络传输的数据量,这对移动用户尤为重要,能够节省用户的数据流量费用,同时也减轻了网络拥堵状况。

浏览器刷新行为对比

刷新方式场景行为响应情况
刷新(F5)查看最新内容,利用缓存加速携带验证头(If-Modified-Since, If-None-Match)请求服务器- 304 Not Modified: 使用缓存
- 200 OK: 返回新资源
Ctrl+F5(强制刷新)忽略缓存,强制获取最新版本不带验证头,直接请求服务器新资源始终 200 OK,提供最新内容
地址栏回车类似首次访问,依据缓存策略可能携带验证头,请求服务器确认与 F5 相似,根据资源状态返回 304200

总结

类型描述
F5/地址栏回车利用缓存策略,平衡加载速度与内容的新鲜度
Ctrl+F5直接忽略本地缓存,确保每次请求都从服务器获取到最新的数据,适用于需要立即看到最新内容的场景

刷新行为对比概览

  • 刷新(F5)

    • 场景:查看最新页面内容,同时利用缓存加速加载。
    • 行为:携带缓存验证头(If-Modified-Since, If-None-Match)请求服务器。
    • 响应
      • 304 Not Modified: 使用缓存。
      • 200 OK: 服务器返回新资源。
  • Ctrl+F5(强制刷新)

    • 场景:忽略所有缓存,强制获取最新版本。
    • 行为:不带缓存验证头,直接请求服务器新资源。
    • 响应:始终200 OK,提供最新内容。
  • 地址栏回车

    • 场景:类似首次访问,根据缓存策略决定。
    • 行为:可能携带验证头,请求服务器确认。
    • 响应:与F5相似,依据资源状态返回304200

总结

  • F5/地址栏回车:利用缓存策略平衡加载速度与内容更新。
  • Ctrl+F5:直接忽略缓存,确保获取最新数据。

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

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

相关文章

更换Homebrew镜像源

Homebrew 是 macOS 上非常受欢迎的包管理工具&#xff0c;但有时由于网络问题&#xff0c;从默认源下载软件包可能会非常缓慢。为了解决这个问题&#xff0c;我们可以将 Homebrew 的源更换为国内的镜像&#xff0c;以提高下载速度。以下是更换 Homebrew 镜像源的通用步骤及错误…

【Pytorch实战教程】基于投影梯度下降(PGD)方法的对抗样本生成

文章目录 1. 总体介绍2. 完整代码3. 投影梯度下降(PGD)方法的详细介绍3.1. 背景3.2. PGD方法简介3.3. PGD攻击算法步骤3.4. PGD攻击的实现3.5. 代码解释3.6. 核心代码解释:4 补充说明x = inputs.detach()的详细解释1. 总体介绍 使用PyTorch实现基于投影梯度下降(Projected…

npm ERR! ..... reason: certificate has expired(淘宝镜像过期)

在执行npm install命令时&#xff0c;报错如下 npm ERR! request to https://registry.npm.taobao.org/babel/plugin-syntax-dynamic-import/download/babel/plugin-syntax-dynamic-import-7.8.3.tgz failed, reason: certificate has expired原因&#xff1a;淘宝证书过期 解…

vue2面试题——指令

1. 如何自定义指令 全局指令&#xff1a;在main.js里面写 /* 全局自定义指令 */ // main.js文件 import Vue from vue import App from ./App.vue import router from ./router import store from ./storeVue.config.productionTip falseVue.directive(demo,{inserted: functi…

【新闻】金融专业“免进”!私募巨头招聘涌现“新剧情”

A股市场在2024年逐渐出现新的运行特征&#xff0c;这不禁让部分主动投资的私募巨头公司重新登上招聘舞台。 但这一次&#xff0c;他们的招聘方向出现了新的变动。 有些机构有意识的为公司投研团队招聘“衔接”岗&#xff0c;有些则把重点放在了投研动作的交易层。 但这都不如…

小公司全栈是归宿吗?

在软件开发领域&#xff0c;特别是在小公司或初创公司中&#xff0c;全栈开发者的角色确实相对普遍和重要。然而&#xff0c;说“全栈是归宿”可能过于绝对&#xff0c;因为每个开发者的职业路径和兴趣点都是不同的。 以下是关于全栈开发在小公司的一些考虑&#xff1a; 需求…

JS实现:计算不同时区的当地时间

国内的时间都以北京时间为准&#xff08;即东八区的时间&#xff09;&#xff0c;如何计算同一时间下其它时区的当地时间呢&#xff1f; 通常的做法&#xff0c;是计算出时区差&#xff0c;然后进行加减。 还有另一种方法&#xff0c;就是先把本地时间转为 0时区的utc时间&…

如何使用代理 IP 防止多个 Facebook 帐户关联 - 最佳实践

在社交媒体被广泛应用的今天&#xff0c;Facebook作为全球最大的社交网络平台之一&#xff0c;面临着很多挑战&#xff0c;其中之一就是用户行为的管理和安全。 为了防止多个账户之间的关联和滥用&#xff0c;Facebook需要采取一系列措施&#xff0c;其中包括使用静态住宅代理…

云计算运维工程师的突发状况处理

云计算运维工程师在应对突发的故障和紧急情况时,需要采取一系列迅速而有效的措施来最小化服务中断的时间并恢复系统的稳定性。 以下是一些关键步骤和策略: 快速响应: 立即识别并确认故障的性质和范围。通知团队成员和相关的利益相关者,确保所有人了解当前情况。故障诊断:…

【论文阅读】-- MultiStream:探索分层时间序列的多分辨率流图方法

MultiStream: A Multiresolution Streamgraph Approach to Explore Hierarchical Time Series 摘要1 引言2相关工作2.1 堆叠图和流图可视化2.2 时间序列的层次结构2.3 交互技术 3 需求分析4 视觉映射和功能4.1 设计原理总结4.2 概述4.3 多分辨率视图4.4 控制器4.5 层次管理器 5…

使用 ADB 查看 Android 设备的 CPU 使用率(详解)

在 Android 开发和调试过程中&#xff0c;监控设备的性能数据至关重要。CPU 使用率是一个关键的性能指标&#xff0c;它能够帮助开发者识别应用的性能瓶颈和优化机会。本文将详细介绍如何使用 Android Debug Bridge (ADB) 查看设备的 CPU 使用率&#xff0c;并解释终端上各个参…

ssm日常项目中问题集合

一、 在Spring MVC和Spring Boot中&#xff0c;如果你的控制器方法参数被标注为一个Java对象&#xff0c;并且该对象的字段与表单输入字段的名称匹配&#xff0c;Spring会自动将表单数据绑定到该对象上。这种机制称为数据绑定&#xff08;Data Binding&#xff09;。 假设你有…

探索ChatGPT在程序员日常工作的多种应用

引言 在现代科技迅猛发展的今天&#xff0c;人工智能的应用已经深入到我们生活和工作的各个方面。作为程序员&#xff0c;我们时常面临大量繁杂的任务&#xff0c;从代码编写、错误调试到项目管理和团队协作&#xff0c;每一项都需要花费大量的时间和精力。近年来&#xff0c;…

基于信息论的高动态范围图像评价算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于信息论的高动态范围图像评价算法matlab仿真&#xff0c;利用一种自然图像的概率模型对图像的熵与成像动态范围之间的关系进行了数值模拟,得到了具有普遍意义上…

【数据库】Oracle安装报错(口令设置问题)

目录 一、问题场景&#xff1a; 二、问题描述 三、原因分析&#xff1a; 四、解决方案&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 一、问题场景&#xff1a; Oracle安装 二、问题描述 Oracle安装意外中断导致【口令管理】用户没有取消勾选/修改密码 三、原因…

mybatis中动态sql语句like concat(“%“,#{xm},“%“)

1、动态SQL是一种可以根据不同条件生成不同SQL语句的技术&#xff0c;随着用户输入或外部条件变化而变化的SQL语句 2、SQL语句中的like模糊查询 xm like %小米%&#xff0c;但开发中经常用到 xm like concat("%",#{xm},"%")&#xff0c;可以防止sql注入…

程序员必备的ChatGPT技巧:从代码调试到项目管理

近年来&#xff0c;随着人工智能技术的迅猛发展&#xff0c;ChatGPT作为一种强大的对话式AI工具&#xff0c;已经广泛应用于各个领域。而对于程序员来说&#xff0c;ChatGPT不仅可以帮助他们解决编程中的各种问题&#xff0c;还能在项目管理中发挥重要作用。本篇博客将详细介绍…

探索小众爱好:打造个人韧性与特色之路

在这个信息爆炸的时代&#xff0c;我们很容易陷入“千篇一律”的漩涡中&#xff0c;无论是生活方式还是兴趣爱好&#xff0c;似乎都趋向于某种“流行”或“热门”。然而&#xff0c;真正的个性与魅力&#xff0c;往往来源于那些不为大众所知的小众爱好。今天&#xff0c;我想和…

2024 最新运营小工具 API 推荐,助力高效工作

在当今数字化运营的时代&#xff0c;各种高效便捷的 API 服务成为了企业和个人提升运营效率、获取精准数据的得力助手。无论是进行市场调研、拓展业务&#xff0c;还是优化网络资源配置&#xff0c;都离不开这些强大的工具。本文将为您详细介绍一系列实用的运营小工具 API 服务…

Spring中@Autowired与@Resource注解的对比与差异

Spring中Autowired与Resource注解的对比与差异 在Spring框架中&#xff0c;Autowired和Resource是两个常用的注解&#xff0c;用于实现依赖注入&#xff08;Dependency Injection&#xff09;。虽然它们都服务于相同的目的&#xff0c;但在使用方式和特性上有所不同。本教程将…