【浅解】浏览器缓存

article/2025/11/10 19:23:53

缓存

为什么有缓存?

缓存在活中其实很常见。往往初次打开一个新的软件或者网页的时候都会相对较慢, 但是再次打开就会快很多, 这就是缓存的功劳。大大提高了效率,也大大提高了用户体验。

什么数据可以缓存?

不能缓存的数据

  • 实时更新替换的数据(例如: 弹幕,留言,评论,经常更换的广告图片)
  • 网页的 HTML 结构, 在网页使用过程中结构会随着操作发生变化
    缓存中的数据
  • 静态资源很少发生改变的图片(例如:商品图片,用户头像,网站logo)
  • 使用过的视频数据,音频数据都会在缓存里

技术层面的缓存 - Web 缓存

在前端开发中,性能一直都是重点问题,判断一个网站的性能就是看网页打开的速度。然而提高网页反应速度就要使用 Web 缓存。

Web 缓存的优点 :

  • 节约了网络的资源
  • 提高了网络的效率
  • 缩短网页请求资源的距离
  • 减少网络延迟
  • 减少带宽
  • 降低网络负荷

Web 缓存的种类 :

1 . 数据库缓存

  • 通过缓存数据库查询结果,加快访问速度,减少数据库访问次数,缓解数据库压力,以提高 web 应用速度
    2 . 代理服务器缓存
  • 在不能访问服务器时,使用代理服务器满足的 HTTP 请求(例: 跨域 Porxy)
    3 . CDN 缓存
  • 通过在网络各处放置节点服务器, 快速可靠地分发静态内容,
    4 . 浏览器缓存
  • 加速浏览,浏览器在用户磁盘上对请求过的资源进行存储,当再次请求这个页面时,浏览器就可以从本地取出资源响应给用户,这样就可以加速页面浏览

浏览器缓存

浏览器缓存包含 : HTTP 缓存、indexDB、cookie、localstorage 、sessionStorage

1 . http 缓存(强制缓存 & 协商缓存)

强制缓存

什么是强制缓存

  • 请求的资源本地缓存中有,资源从本地缓存获取,不需要发起请求
  • 想理解强制缓存,先知道什么是缓存控制

缓存控制

在http中,控制缓存开关的属性有两个:PragmaCache-Control

Pragma

Pragma 有两个情况 Pragma 和 Expires 。

  • Pragma 的值为 no-cache : 表示禁用缓存
  • Expires 的值是一个时间(格林尼治标准时间) : 表示该缓存的有效时间
    注意 : 当 http 响应头中同时出现 PragmaCache-Control , 缓存控制执行优先级从高到低是 Pragma ==> Cache-Control ==> Expires

Cache-control

Cache-Control 在 http 请求头和响应头中,用来控制 http 缓存的

cache-control.png

常见 请求头 中的Cache-Control 指令

  • Cache-Control: max-age=<seconds> : 缓存存储的最大周期
  • Cache-Control: max-stale[=<seconds>] : 客户端愿意接收一个已经过期的资源
  • Cache-control: no-cache : 重新验证是否缓存(协商缓存验证)
  • Cache-control: no-store : 禁止缓存

常见 响应头 中的Cache-Control 指令

  • Cache-control: must-revalidate 资源过期后重新请求
  • Cache-control: no-cache 请求是验证是否缓存(协商缓存验证)
  • Cache-control: no-store 不使用任何缓存
  • Cache-control: private 同意本地浏览器缓存
    详情查看官方文档

强制缓存的执行流程

流程情景1 - 初次请求

浏览器会向服务器发起请求 ==> 服务器接收到浏览器的请求 ==> 响应资源并在响应头中携带 Cache-Control 给客户端( Cache-Control 值为缓存的最大过期时间)

流程情景2 - 再次请求相同的数据

浏览器会先查看Cache-Control 是否过期 ==> 没有过期 ==> 浏览器直接从缓存中拉取资源(此过程不用经过服务器)

流程情景3 - Cache-Control 过期

cache-control 过期了 ==> 没有办法拉取缓存中的数据 ==> 继续执行流程情景1

协商缓存

是什么协商缓存
协商缓存,也叫对比缓存。一种服务端的缓存策略

  • 服务端判断客户端的资源
    • 返回 304表示缓存中的资源和请求的资源一致 ,
    • 返回 200 表示从服务器返回的最新的资源。
  • 想理解协商缓存,先知道什么是缓存校验

缓存校验

如何确定缓存数据有效,校验缓存是否是最新的(和服务器中最新的数据一样)

  • 在响应头中有两个属性(资源标识),ETagLast-Modified 用来帮助服务器控制客户端的缓存校验。

Last-Modified

  • 值为资源的最后修改时间,对应请求头的属性为 If-Modified-Since 
    Etag
  • ETag 是 HTTP1.1 中加入的新属性
  • 表示资源的唯一标识,所谓唯一,和id一样,具有唯一性。对应请求头为 If-None-Match 。
    • Etag 的本质是一个字符串
      注意 : 当响应头中同时存在 Last-Modified 和 Etag ,会优先使用 Etag(更加精确)

协商缓存的执行流程

流程情景1 - 初次请求

客户端向服务器发出请求 ==> 服务器收到请求 ==> 响应资源和相对应的资源标(EtagLast-Modified)识给客户端

流程情景2 - 再次请求

浏览器再次发起请求 ==> 请求头会携带If-None-Match (或 If-Modified-Since) 去找服务器 ==> 服务器将If-None-Match (或 If-Modified-Since) 和自己的Etag(或 Last-Modified) 的值对比(两种情况)

  • 如果相等,则返回 304 ,表示缓存资源和客户端资源一致
  • 如果不相等,则返回 200,并返回资源和新的Etag (或Last-Modified) 的值。

Last-Modified 和 Etag的异同点

相同点 : Last-Modified 和 Etag 用来帮助服务器控制客户端缓存校验的属性

不同点 :

  1. 存储的值不同
    • Last-Modified存储的值是最后修改数据的时间, 而请求头中携带的If-Modified-Since是浏览器中缓存的时间
    • Etag中存储的是一个字符串,和id一样的具有唯一性,而请求头中携带的If-None-Match是浏览器上传收到数据时携带的Etag
  2. 服务器对比方式不同
    • Last-Modified : 如果缓存的时间和最后修改的时间一致,则缓存命中,响应 304,否则不命中,向服务端请求资源,响应 200 和最新的资源,并在响应头中携带这次的 last-modified,把这次的 last-modified 存到 if-modified-since
    • Etag 内容比对,用来判断缓存内容的 if-none-match 和服务器内容的 Etag 是否相等,如果相等则说两处的资源相等,缓存命中响应 304,否则请求资源,响应 200 和最新的资源,并在响应头中携带新的 Etag,

协商缓存流程图

协商缓存.png
注意 : 刷新浏览器页面,强制缓存会失效,而协商缓存有效。

2 . indexDB

IndexedDB 就是浏览器提供的本地数据库,它可以被网页脚本创建和操作。IndexedDB 允许储存大量数据,提供查找接口,还能建立索引。这些都是 LocalStorage 所不具备的。就数据库类型而言,IndexedDB 不属于关系型数据库(不支持 SQL 查询语句),更接近 NoSQL 数据库。

详情参考官方文档:

3 . Cookie

Cookie 是什么

  • Cookie 直意为小甜饼。用于数据缓存,cookie 存放数据量非常小,它的大小限制为4KB以内。可以缓存用户登录信息(例如:token)。

Cookie 的作用

  • Cookie 缓存的数据始终在同源 http 中携带,在浏览器和服务器之间传递
  • Cookie 缓存可以做数据持久化,Cookie 数据在设置的 Cookie 过期时间之前都有效(数据在缓存中关闭浏览器窗口不能删除 Cookie 数据)

cookie的使用

  • 下载依赖包 :npm i js-cookie 或者 yarn add js-cookie
  • 导入 : import Cookies from 'js-cookie'
  • 存入数据语法 : Cookies.set('键', '值',{ expires: 7, path: '' })
    • 第三参数为一个对象, 对象的属性有expirespath
    • expires : 创建一个过期 cookie,值为天数
    • path : Cookie只对当前路径的页面有效
  • 使用数据语法 : Cookies.get('键')

注意 : Cookies 中有路径的概念,可以限制 Cookies 数据所属路径

4 . localStorage

1 . localStorage 作用 : 本地存储

  • 经典场景 : 免登录
    2 . localStorage 语法 :
  • 2.1 存数据 : localStorage.setItem('属性名',属性值)
  • 2.2 取数据 : localStorage.getItem('属性名')
  • 2.3 删数据 : localStorage.removeItem('属性名')
  • 2.4 清空数据 : localStorage.clear()

3 . localStorage 特点 :

  • 3.1 localStorage 是 永久存储 的, 除非 手动清除 ,否则一直存在。
  • 3.2 localStorage 只能存储 字符串类型 数据。 如果是其他类型,则会自动转成字符换格式存储。

5 . sessionStorage

1 . sessionStorage 作用 : 临时存储

  • 经典场景 : 页面间传值

2 . sessionStorage 语法和 localStorage 完全一致 :

  • 2.1 存数据 : sessionStorage.setItem('属性名',属性值)
  • 2.2 取数据 : sessionStorage.getItem('属性名')
  • 2.3 删数据 : sessionStorage.removeItem('属性名')
  • 2.4 清空数据 : sessionStorage.clear()

3 . sessionStorage 特点 :

  • 3.1 sessionStorage 页面关闭后就 自动清除 了。
  • 3.2 sessionStorage 只能存储 字符串类型 数据。 如果是其他类型,则会自动转成字符换格式存储。

cookie、localStorage、sessionStorage异同

CookielocalStoragesessionStorage
数据保存的期限一般由服务器生成,可设置保存时间。需要手动清除,否则永久保存仅在当前页面有效,关闭页面或浏览器后被清除
存放数据大小4KB以内5MB或更大5MB或更大
与服务器关系每次都会携带在HTTP头中,在浏览器和服务器之间传递保存与客户端硬盘中,不参与和服务器的通信保存在客户端内存中,不参与和服务器的通信

http://chatgpt.dhexx.cn/article/tIbq19j6.shtml

相关文章

Google Chrome谷歌浏览器清理缓存的常用方法

Google Chrome谷歌浏览器清理缓存的常用方法 方式一&#xff1a;清除缓存快捷键 CtrlShiftDelete 方法二&#xff1a;按F12,按刷新按钮&#xff0c;会显示3个选项,选择清空缓存并硬性重新加载。 额外使用场景说明&#xff1a; 互联网在全球的普及率与日俱增。与此同时&…

浏览器清缓存清缓存

浏览器清缓存&清缓存 区别方法 区别 浏览器清缓存&#xff1a;清除浏览器里浏览或下载的缓存文件。 清理缓存&#xff1a;是系统里面的缓存文件。 方法 一、浏览器清缓存 浏览器设置里面点清除缓存&#xff0c;如chrome&#xff1a; 二、清理缓存 mac电脑的缓存清理 选…

如何清除谷歌浏览器缓存

方式一&#xff1a; 快捷键&#xff1a;CtrlShiftDelete 键盘上同时按下这三个键&#xff0c;会出现如下界面&#xff0c;然后&#xff0c;直接点清除数据即可&#xff01; 方式二&#xff1a; 手动调出清除数据的界面 按图片方式&#xff0c;找到清除数据的界面

谷歌浏览器如何清理缓存

1.打开谷歌浏览器。点击右上方的设置图标&#xff0c;进入设置选项。 2.点击选择中的【设置】&#xff0c;进入到设置页面。 3.在最下方&#xff0c;点击【显示高级设置】 4.可以看到&#xff0c;在展开的高级设置里面&#xff0c;点击【清除浏览数据】 5.勾选要清理的…

不知道浏览器怎么清除缓存?各种浏览器清理缓存的方法

经常使用电脑的人都知道&#xff0c;在电脑上安全不同的浏览器&#xff0c;当使用这些浏览器浏览网页、看视频等&#xff0c;用了一段时间后感觉电脑反应速度越来越慢。这是因为使用浏览器浏览网页会存在一些缓存&#xff0c;日积月累电脑的反应速度就慢了。不知道如何清除浏览…

清除浏览器缓存的所有方法

1.清除浏览器缓存 1、Disable cache 打开开发者工具&#xff08;F12&#xff09;&#xff0c;选择 Network——Disable cache 即可。需要清除某网站缓存时 F12 打开开发者工具就会自动清除这个网站的缓存&#xff0c;而不必清除所有网站的缓存了。 这个可以解决绝大多数jsp缓…

清除手机浏览器缓存

每次项目发布后&#xff0c;Android手机总存在几分至20几分钟的缓存&#xff0c;清除有以下方法&#xff1a; 用户行为清除缓存&#xff1a; 方法1.打开手机浏览器 -->我的-->设置-->清除浏览数据-->页面缓存右侧勾去掉&#xff0c;返回浏览器即可。 方法2.打开手…

如何清除chrome浏览器缓存

清除浏览器的缓存 知识调用前言引入具体操作 知识调用 文章中可能用到的知识点前端学习&#xff1a;浏览器缓存方式有哪些&#xff08;http协议 websql indexDB cookie localstorage sessionstorage&#xff09;如何查看Chrome浏览器的页面缓存内容【详细教程】 前言引入 上…

如何清理电脑浏览器缓存,4款常用浏览器清理缓存的方法

浏览器是人们在网络生活中不可缺少的存在&#xff0c;我们使用各种浏览器上网的时候&#xff0c;可能会出现各种程序出错的问题。或者&#xff0c;可能使用浏览器的时间就了&#xff0c;发现电脑有点卡顿&#xff0c;这时候就需要情况缓存了。那么&#xff0c;如何清理电脑浏览…

python鸭子类型_你知道什么是Python里的鸭子类型和猴子补丁吗?

有时候我们会听到Python里所谓的鸭子类型和猴子补丁的说法&#xff0c;乍一听还以为是来到了动物园&#xff0c;Python这只大蟒蛇还可以和鸭子和猴子一起玩耍&#xff1f; 非也非也&#xff0c;鸭子类型和猴子补丁实际上是两个生动有趣的比喻&#xff0c;用来说明Python的动态特…

java鸭子类型_Golang中的接口与鸭子类型

1 接口的定义与理解 接口是一个自定义类型&#xff0c;它是一组方法的集合。从定义上来看&#xff0c;接口有两个特点。第一&#xff0c;接口本质是一种自定义类型&#xff0c;因此不要将golang中的接口简单理解为C/Java中的接口&#xff0c;后者仅用于声明方法签名。第二&…

编程语言中的 DUCK TYPING|python、c++、java、go

如果一只动物走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子&#xff0c;那么这只动物就可以被称为鸭子。 许多编程语言都支持 Duck Typing &#xff0c;通常 Duck Typing 是动态编程语言用来实现多态的一种方式。 在理解 Duck Typing 前&#xff0c;先看一张图片&#xff0c;…

Windows中采用命令行方式启动服务

1. 服务名不一定是你在服务面板看到的那个名&#xff0c;例如&#xff0c;你要打开被禁用的telnet服务&#xff0c;sc config telnet start auto,报错&#xff1a;[SC] OpenService FAILED 1060&#xff0c;因为telnet的服务名不是telnet而是tlntsvr, sc config tlntsvr start …

CentOS开启服务命令详解

一、学前须知 讲服务管理之前先了解下Linux的启动流程非常有必要&#xff0c;直观的先上CentOS的启动图&#xff1a; Centos7 Centos6的也补充下&#xff1a; 图片信息量较大&#xff0c;网友可根据自己的知识水平逐一按上图去填充自己&#xff0c;也欢迎指正&#xff1b;本节…

启动consul服务命令

启动Consul 安装配置好Consul以后&#xff0c;我们可以通过简单的命令启动consul。先来看最简单的启动方式&#xff1a; consul agent -dev 在新终端中&#xff0c;执行如上操作。 hongweiyulocalhost:~$ consul agent -dev > Starting Consul agent... > Consul agen…

Windows 服务快捷启动命令

Windows 服务快捷启动命令 gpedit.msc&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;组策略sndrec32&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;录音机nslookup&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d; ip地址侦测器…

Linux 系统启动与服务管理

文章目录 1. 前言2. Linux 系统启动过程2.1 开机自检2.2 MBR 引导2.3 GRUB 菜单2.4 加载 Linux 内核2.5 init 进程初始化2.6 系统启动过程总结 3. init 进程与 systemd3.1 init 进程3.2 Centos5/6/7 init 进程对比3.3 systemd3.4 systemd 单元类型3.5 运行级别对应的 systemd 目…

linux启动服务

查看开机启动项 1&#xff1a;systemctl list-unit-files --typeservice 2&#xff1a;systemctl list-unit-files --typeservice | grep enabled 3&#xff1a;systemctl list-unit-files --typeservice | grep disabled 开机停止某个服务&#xff1a; 1&#xff1a;sudo …

Linux常用启动服务命令

一、Nginx 1、启动 [root172 udm-web]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf2、重新加载配置文件 [root172 udm-web]# /usr/local/nginx/sbin/nginx -s reload二、防火墙 1、查看状态 systemctl status firewalld2、关闭防火墙 systemc…

Windows 启动服务命令大全

描述&#xff1a; 在日常工作学习中&#xff0c;可能会常用到windows系统自带的计算器、记事本、画图等小工具&#xff0c;本文将介绍如何使用命令快速打开这些小工具。 1、快速启动画图工具 在以下三个地方输入画图工具命令&#xff1a;mspaint &#xff0c;然后按“Enter”或…