浅析浏览器的缓存

news2024/7/6 18:23:04

随着浏览器功能的日益强大,在工作中,浏览器是前端工程师们最重要的战友和开发调试工具,它承载着用户最舒适的用户体验,ui最佳的设计成果展示,后台数据最直观的展示。因此,对浏览器的认识和理解起到举足轻重的地位,现学习浏览器的缓存知识分享如下,欢迎各位

整个web应用简易流程如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jq0kwNp0-1686303494607)(https://note.youdao.com/yws/res/27583/WEBRESOURCE0997c691b6666a03191bb50f50e179b4)]

上述流程,哪些地方比较耗费时间

  • 发送请求的时候
  • 涉及大量运算的时候
  • 查询响应数据也会消耗时间

缓存在很多地方都有运用

  • 数据库缓存
  • CDN缓存
  • 代理服务器缓存
  • 浏览器缓存
  • 应用层缓存

整个浏览器的缓存基本过程如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pkctxRoM-1686303494608)(https://note.youdao.com/yws/res/27588/WEBRESOURCE79010bef586b436586549a45a8de6157)]

  • 浏览器每次发请求,都会先到浏览器缓存中查找该请求的结果和缓存标识
  • 浏览器每次拿到返回的响应结果都会将结果和缓存标识存入浏览器缓存中

按缓存的存储位置分类

从缓存的位置来说,分为四种,并且各有优先级,每次请求依次查找都没有才会去请求网络。

  • Service Worker(手动)

    • 运行在浏览器背后的独立线程,一般用来实现缓存功能。类似于一个代理服务器

    • 传输协议必须是https,因为Service Worker中涉及到请求拦截,所以必须用HTTPS来保障安全。

    • 使用方法:注册–> 监听install事件–>缓存需要的文件

  • Memory Cache(自动)

    • 内存中的缓存,读取速度快

    • 内存容量小,关闭tab页面,内存中的缓存也就释放了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ZzLyq08-1686303494609)(https://note.youdao.com/yws/res/27592/WEBRESOURCE9164f4f928e7e30131d9efa685ddb586)]

  • Disk Cache (自动)

    • 硬盘上的缓存,读取速度比内存缓存慢

    • 时效性和容量大大优于 Memory Cache

    • 浏览器会自动的根据HTTP Header中的字段判断哪些资源需要缓存,哪些资源可以不请求直接使用,哪些资源已经过期了需要重新请求。

    • 浏览器会自动进行清理,算法会把最老的资源删除。

  • Push Cache

    • 推送缓存。http/2(2015)中新增的内容

    • 当以上三种缓存都没有使用才会被使用到

      • 所有的资源的资源都会被推送,并且能够被缓存,但是Efge和safari浏览器支持相对较差。

      • 可以推送no-cache和no-store的资源

      • 一旦连接被关闭,Push Cache 就被释放

      • 多个页面可以使用同一个HTTP/2的连接,也就可以使用同一个Push Cache,这主要还是依赖浏览器的实现而定,出于对性能的考虑没有的浏览器会对相同域名但不同的tab标签使用同一个HTTP连接

      • pushCache的缓存只能被使用一次

      • 浏览器可以拒绝接收已经存在的资源推送

      • 你可以给其他域名推送资源

按缓存的类型分类

分为 强制缓存 和 协商缓存

【注意】 无论是强制缓存还是协商缓存都是DiskCache或者叫做HTTPCache的一种

强制缓存

客户端发送请求,先访问缓存,有则返回,没有则请求服务器,响应再缓存

强制缓存减少请求数,是提升最大的缓存策略,

可以造成强制缓存的字段是 Cache-control 和 Expires

Expires

这是HTTP1.0的字段,表示缓存到期时间(绝对时间【当前时间+缓存时间】)

Expires:Thu,10 NOV 2017 08:11:33 GMT

在响应消息头中,设置这个字段之后,就可以告诉浏览器,在未过期之前不需要再次请求。

缺点:字段设置多个空格,少个字母,都会导致变为非法字符属性从而导致失效。时差和客户端修改时间也会导致缓存失效,所以不好用。

Cache-control

自从HTTP/1.1开始,Expires逐渐被Cache-control取代。

在http/1.1中,增加了该字段,该字段表示资源缓存的最大有效时间,在该时间内,用户不需要向服务器发送请求。

Cache-control是一个相对时间,即使客户端时间发生改变,相对时间也不会随之改变,这样可以保持服务器和客户端的时间一致性,而且Cache-control的可配置型比较强大,Cache-control的优先级高于Expires。

Cache-control设置的是相对时间:

Cache-control:max-age=2592000

Cache-control里的属性

  • max-age:最大有效时间
  • must-revalidate:超过最大有效时间,浏览器必须向服务器发送请求,验证资源是否有效
  • no-store:不走缓存
  • no-cache:不走缓存由协商缓存决定
  • public:所有内容都被缓存
  • private:所有内容只有客户端可以缓存,代理服务器不能缓存,默认值。

可混用有优先级,例如:

Cache-control:public,max-age=259200

为了兼容http1.0和http1.1,实际项目中Cache-control和Expires都会设置

协商缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gY2macfy-1686303494610)(https://note.youdao.com/yws/res/27734/WEBRESOURCE6bf466f38cbeb8c568368093ada6b181)]

强制缓存(强制时间内使用缓存)失效,比如max-age到期了,就要使用协商缓存(客户端向服务器发送请求,携带资源标识,服务器会把资源标识和服务器做对比,如果资源没发生改变,服务器就会返回304,告诉客户端资源无更新,客户端会继续使用缓存,如果资源有改变,服务器返回新的数据、缓存规则、200的code码,浏览器将新的规则写入缓存),由服务器决定缓存内容是否失效。

协商缓存的主要优化主要体现在响应上通过减少响应体体积,来缩短网络传输时间,所以强制缓存比提升幅度较小,但总比没有缓存好

协商缓存是可以强制一起使用的,作为在强制缓存失效后的一种后背方案。

协商缓存里的对比方式

  • Last-Modified & If-Modified-since
  • Etog & If-None-Match

Last-Modified & If-Modified-since

1.服务器通过Last-Modified字段告知客户端,资源最后一次被修改的时间
2.浏览器将这个值和内容一起记录在缓存数据库中
3.下一次请求相同的资源,浏览器会从自己的缓存中找到"不确定是否过期"的缓存,因此在请求头中将Last-Modified的值写入到请求头的If-Modified-since字段
4.服务器会将If-Modified-since的与last-modified的字段进行对比,如果相等,则表示未修改,响304,反之,则表示修改了,响应200状态码,并返回数据

缺陷:1.资源更新的速度是毫秒,那么该缓存是不能被使用的,因为它的时间单位最低是秒
2.文件如果是服务器动态生成的,那么该方法的更新时间永远是生成的时间,尽管文件可能没有变化,所以起不到缓存的作用。

所以http/1.1出现了 Etog & If-None-Match

Etog & If-None-Match

1.Etog存储的是文件的特殊标识(一般是一个hash值),服务器存储着文件的etog字符
2.浏览器请求资源,服务端返回资源和一个Elag
3.下一次请求,强缓失败,带着elog来找服务器要资源,即此在请求头中将elog写入到请求头的If-None-Match字段
4.资源未更新,返回304状态码

缓存读取规则

当浏览器请求资源时:

  • 从Service Worker中获取内容(如果设置了Service Worker)

  • 查看Memory Cache

  • 查看Disk Cache。这里又细分:

    • 如果有强制缓存,则使用强制缓存, 不请求服务器,这时的状态码全是200
    • 如果有强制缓存但已失效,使用协商缓存,比较后确定时304还是200.
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zll0n8dA-1686303494611)(https://note.youdao.com/yws/res/27822/WEBRESOURCE72bf558cc13d8337f108e528efea7779)]
  • 发送网络请求,等待网络响应

  • 把响应的内容"自动"存入DiskCache(如果HTTP响应头有相应配置的话)

  • 把响应内容的引用"自动"存入MemoryCache(无视http头信息的配置)

  • 把响应内容存入Service Worker 的Cache Storage(如果设置了Service Worker)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ByxzJskl-1686303494611)(https://note.youdao.com/yws/res/27825/WEBRESOURCE77d265260629d76fba07ed818a1f0491)]

浏览器行为

用户对浏览器的不同操作,会触发不同的缓存读取策略

  • 正常打开网页,地址栏输入网址,查找Disk Cache是否匹配,有就是用,没有就正常发送请求
  • f5刷新,tab没有关闭,优先使用memorycache,然后才是diskcache
  • 强制刷新(ctrl+f5),浏览器不使用缓存,因此发送请求的头部带有Cache-control:no-cache(为了兼容还带有pragma:no-cache),服务器直接返回200和最新的内容。

缓存的最佳实践

对于频繁变动的资源

对于经常发生变化的资源,可以再响应头设置 Cache-control:no-cache ,使浏览器每次都请求服务器,配合ETog(比对hash)或Lat-Modified(比对时间戳)来验证资源是否有效。

这样的做法虽然不能节省请求的数量,但是因为服务端资源无变化,比对成功,服务端就会返回304,所以会减少请求的数据大小,不用每次都返回200和数据。

对于不常变化的资源

再处理这类资源,通常会配置一个很大的max-age=31536000(一年),这样浏览器之后请求相同的URL会命中强制缓存。

为了解决更新的问题,就需要在文件名(或者路径)中添加Hash,版本号等动态字符,从而达到更改URL的目的,由于这样设置会使请求的资源不同,所以强制缓存也就不再使用,浏览器会重新发送请求,进入协商缓存。

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

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

相关文章

使用pipe、select实现线程间通信和性能测试

一 代码实现 理论依据: 管道中无数据时,读阻塞。 写数据时,长度小于PIPE_BUF时,写数据是原子操作,这样不会出现写一半的情况。在我的虚拟机上PIPE_BUF的值是4096,在标准中linux系统中该值都是4096. 测试代…

小型极简主义 Linux 发行版:Peropesis

导读Peropesis 是 personal operating system 的转写简拼,一个小型、极简主义、基于命令行的 Linux 操作系统。目前仍是一个不完整的系统,但它正在不断改进。 此外,它是一个由自由软件创建的自由操作系统,在 GNU GPL 或 BSD 许可下…

csdn编辑模式

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

非授权访问测试-业务安全测试实操(9)

非授权访问测试, 越权测试 非授权访问测试 测试原理和方法 非授权访问是指用户在没有通过认证授权的情况下能够直接访问需要通过认证才能访问到的页面或文本信息。可以尝试在登录某网站前台或后台之后,将相关的页面链接复制到其他浏览器或其他电脑上进行访问,观察是否能访…

第二届BSN全球技术创新发展峰会在武汉成功举行

6月9日,由湖北省人民政府指导,湖北省发展改革委、国家信息中心联合主办,中国移动、中国电信、中国联通、武汉市江汉区人民政府、区块链服务网络(BSN)发展联盟、湖北省楚天云公司承办的第二届区块链服务网络&#xff08…

汽车功能安全中CPU lockstep技术浅析

知识的价值在于分享,欢迎大家批评指正,共同进步。 目录 1 功能安全 2 技术特性 3 安全系统架构 4 TI Hercules系列 4.1 TMS570安全概念基本原理 4.1.1 1oo1D双核安全概念 4.1.2 1oo1D优势 总结 参考文献 1 功能安全 根据ISO26262-2018&#xff0…

CVPR 2023 | 计算机视觉顶会亮点前瞻

在知识和技术都迅速更新迭代的计算机领域中,国际计算机视觉与模式识别会议(CVPR)是计算机视觉方向的“顶级流量”,引领着学科及相关领域的研究潮流。今天我们为大家带来5篇微软亚洲研究院被 CVPR 2023 收录的论文,主题…

【Linux】MySQL数据库 (一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MySQL数据库 一、数据库的基本概念二、数据库系统发展史1.第一代数据库2.第二代数据库3.第三代数据库 三、当今主流数据库介绍1.关系数据库2.非关系数据库 四、MySQL数据库管…

浅谈中移链中插件的功能及使用

中移链是在满足我国信息化监管需求、合规可控的前提下,打造的中国移动区块链服务平台。它允许使用插件来扩展其功能,以适应各种不同的使用场景。 什么是中移链插件呢?如果把中移链比作一个操作系统,那么插件就类比于操作系统上的…

chatgpt赋能python:Python编写选择题程序

Python编写选择题程序 Python是一种高级编程语言,由于其简洁、易读、易懂和易学的特性,使得Python成为了目前最流行的编程语言之一。Python的强大功能也使得它可以轻松地编写各种类型的程序,包括选择题程序。本文将介绍如何使用Python编写选…

SpringBoot全局异常页面处理学习

首先我们先在控制器中写一个异常,默认情况下我们的SpringBoot异常页面是这个样子的。 示例代码如下: import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;/*** author qinxun* date 202…

mov、mvn、cmp等ARM汇编指令集数据处理类指令(三星2440A)

文章目录 前言一、为什么要学习汇编?二、2440下常用汇编指令1. 汇编指令集合2. 2440编译(汇编)工程框架 三、汇编指令详解1. mov指令2. mvn3. add、sub、mul、rsb(算术运算)4. and、orr、eor、bic5. cmp、teq、tst5.1 …

视频会议需要什么设备?视频会议软硬件介绍

视频会议系统简介 视频会议系统是一种通过网络技术实现远程音视频通信的系统。它可以让不同地点的人们在同一时间进行实时的视音频交流,从而实现远程会议、远程教育、远程医疗以及最近比较新兴的直播等应用场景。 视频会议系统组成 视频会议系统通常包括摄像头、…

chatgpt赋能python:Python中如何精确到小数点

Python中如何精确到小数点 Python作为一种高级编程语言,被广泛应用于数据科学、网站开发、人工智能等领域。在处理数字时,精度一直是一个非常重要的问题。本文将介绍如何在Python中精确到小数点,并给出实例演示。 为什么需要精确到小数点 …

C++11学习笔记(4)——通用工具(下)

太长了,分两篇写吧 书接上回 4.数值极值 std::numeric_limits 是 C 标准库中定义的一个模板类,位于 头文件中。它提供了关于各种数值类型的属性和极值的信息。这些信息可以帮助我们在程序中进行数值处理时,了解特定类型的数值范围、精度以及…

Flutter如何获取屏幕的分辨率和实际画布的分辨率

Flutter如何获取分辨率 在Flutter中,你可以使用MediaQuery来获取屏幕的分辨率和实际画布的分辨率。 要获取屏幕的分辨率,你可以使用MediaQuery.of(context).size属性,它返回一个Size对象,其中包含屏幕的宽度和高度。下面是一个获…

Redis中常见的一些问题

缓存穿透问题 什么是缓存穿透? 例如当我们根据id查询一个数据的时候,但是这个数据本身不存在或者已经被删除之后,缓存中不存在,就会去查询数据库,但是不存在的数据不会缓存到数据库中,那么一旦大量的这个请…

层序遍历的应用——判断二叉树是否为完全二叉树

思维导图: 一,完全二叉树的特点 假如我们现在有一颗完全二叉树,那它应该长什么样呢? 它应该长这样: 这样: 这样: 如果不是一…

6 种方式读取 Springboot 的配置,老鸟都这么玩(原理+实战)

大家好,我是小富~ 从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者在这个方面踩坑。 我整理了几种获取配置属性的方式,目的不仅是要让大家学会如何使用&#…

Exiv2 —— exiv2介绍及下载搭建环境(Vs2017)

Exiv2介绍 Exiv2 是一个跨平台C库和一个命令行实用程序,用于管理图像元数据。它提供对Exif,IPTC和XMP元数据以及ICC配置文件的快速简便的读写访问。 嵌入到各种格式的数字图像中。 Exiv2 作为免费软件提供,用于许多项目 包括KDE和Gnome Deskt…