前端常用缓存技术深度剖析

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
💬 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

一、引言

在前端开发中,缓存技术对于提升应用性能、减少网络请求、优化用户体验具有至关重要的作用。随着互联网应用的复杂性和规模不断增加,合理使用缓存成为前端开发人员必须掌握的技能。本文将详细分析前端常用的缓存技术。

二、浏览器缓存

(一)内存缓存

  1. 原理与机制
    内存缓存是将资源临时存储在浏览器的内存中。当浏览器请求资源时,会首先检查内存中是否存在该资源的缓存。如果存在且缓存未过期,就直接从内存中获取。这种缓存方式利用了内存的快速读写特性,能够实现极快的资源获取速度。
  2. 适用场景与优势
    适用于频繁访问且体积较小的资源,如 JavaScript 代码片段、CSS 样式表的部分内容等。其优势在于读取速度快,可在短时间内为页面渲染提供所需资源,提升页面加载的初始速度。例如,在单页应用(SPA)的多次页面切换中,如果相关脚本和样式已经在内存缓存中,就能迅速渲染新页面。
  3. 局限性
    内存缓存的空间有限,且其生命周期与浏览器会话相关。当浏览器关闭时,内存中的缓存资源会被清空,无法长期保存资源。

(二)磁盘缓存

  1. 原理与机制
    磁盘缓存将资源存储在用户计算机的磁盘上。浏览器在请求资源时,会先检查磁盘缓存。磁盘缓存通过文件系统来存储资源,其存储容量相对较大。与内存缓存类似,磁盘缓存也依据缓存控制头信息(如 Cache - Control、Expires 等)来判断资源是否有效。
  2. 适用场景与优势
    对于各种类型的资源,尤其是体积较大的图像、音频、视频以及一些不常变化的大型脚本库等,磁盘缓存非常适用。它能够在浏览器多次启动过程中持续发挥作用,减少重复网络请求。例如,网站的 logo 图片、常用的 JavaScript 框架文件等可以长期存储在磁盘缓存中,提高后续访问的速度。
  3. 缓存更新问题
    磁盘缓存可能存在缓存更新不及时的问题。如果服务器上的资源已经更新,但磁盘缓存中的旧版本未过期,浏览器可能仍然使用旧资源。这需要合理的缓存控制策略来解决,如通过版本号更新或服务器端推送缓存更新通知等方式。

(三)浏览器缓存控制策略

  1. 基于时间的控制(Expires 和 Cache - Control)
    • Expires:这是 HTTP 1.0 中用于指定缓存过期时间的头信息。服务器在响应资源请求时,会在响应头中设置 Expires 值,格式为一个具体的日期和时间(如 Expires: Thu, 01 Jan 2025 12:00:00 GMT)。浏览器根据本地时间与 Expires 指定的时间对比来判断缓存是否有效。然而,这种方式存在一定缺陷,因为如果用户修改了本地时间,可能会导致缓存判断错误。
    • Cache - Control:在 HTTP 1.1 中广泛使用,它提供了更灵活的缓存控制指令。常见的指令包括“public”(表示资源可被任何中间缓存和用户浏览器缓存)、“private”(资源只能被用户浏览器缓存)、“max - age”(指定缓存的最长有效时间,以秒为单位,如 Cache - Control: public, max - age = 3600,表示资源可被公共缓存且 1 小时内有效)等。Cache - Control 的优先级高于 Expires。
  2. 基于验证的控制(Last - Modified 和 ETag)
    • Last - Modified:服务器在响应资源时,会在响应头中包含该资源最后一次修改的时间。当浏览器再次请求该资源时,会在请求头中带上 If - Modified - Since 头信息,其值为上次缓存的 Last - Modified 时间。服务器收到请求后,若资源在该时间之后未修改,则返回 304(Not Modified)状态码,浏览器继续使用缓存资源;若资源已修改,则返回新资源和更新后的 Last - Modified 值。
    • ETag(Entity Tag):这是服务器为资源生成的一个唯一标识符。当浏览器再次请求资源时,会在请求头中带上 If - None - Match 头信息,其值为上次缓存的 ETag。服务器根据 ETag 判断资源是否变化,若未变化,返回 304 状态码,浏览器继续使用缓存;若变化,则返回新资源和新的 ETag。ETag 比 Last - Modified 更精确,因为它可以检测到资源内容在文件修改时间未变情况下的变化。

三、本地存储(Local Storage 和 Session Storage)

(一)Local Storage

  1. 原理与特点
    Local Storage 是一种以键值对形式将数据持久存储在用户浏览器中的机制。它允许前端应用在用户本地存储大量数据(一般每个域名下可存储 5MB 左右),数据不会随着浏览器会话结束而丢失,除非用户手动清除或通过代码删除。
  2. 适用场景
    常用于存储用户的个性化设置、登录凭证(在安全措施到位的情况下)、应用的状态信息等。例如,一个新闻阅读应用可以使用 Local Storage 存储用户选择的新闻类别偏好、字体大小设置等,下次用户打开应用时能自动恢复这些设置。
  3. 与浏览器缓存的区别
    与浏览器缓存不同,Local Storage 中的数据不会自动参与到 HTTP 请求和响应的缓存机制中。它主要是为前端应用提供一种持久化数据存储的方式,由前端代码主动进行读写操作。

(二)Session Storage

  1. 原理与特点
    Session Storage 同样是以键值对形式存储数据,但它的生命周期与浏览器会话相关。当用户关闭浏览器窗口或标签页时,Session Storage 中的数据会被自动清除。它的存储容量一般也在 5MB 左右。
  2. 适用场景
    适用于存储当前会话相关的数据,如购物车中的临时商品信息(在未登录的情况下)、多步骤表单填写过程中的中间数据等。例如,在一个在线购物流程中,用户在添加商品到购物车但未完成购买的过程中,购物车数据可以临时存储在 Session Storage 中。

四、应用缓存(Application Cache)

(一)原理与机制

应用缓存是一种允许网页在离线状态下仍然可以访问的缓存技术。通过在网页的 HTML 文件中使用 manifest 文件来指定需要缓存的资源列表。当用户首次访问页面时,浏览器会根据 manifest 文件下载并缓存指定的资源。此后,即使用户处于离线状态,浏览器也可以从缓存中加载页面和相关资源。

(二)适用场景与优势

对于一些需要在离线环境下使用的 Web 应用,如文档编辑应用、地图应用等,应用缓存非常有用。它可以提高应用的可用性和用户体验,使用户在网络连接不稳定或离线时仍能继续使用部分功能。例如,用户在飞机上可以继续查看之前在在线地图应用中缓存的地图信息。

(三)局限性与问题

应用缓存的更新机制相对复杂。如果 manifest 文件更新,浏览器可能需要重新下载整个缓存资源,这可能会导致较长的加载时间。而且,如果缓存管理不当,可能会出现用户一直使用旧版本应用的问题,需要开发者谨慎处理缓存更新策略。

五、CDN 缓存

(一)原理与机制

内容分发网络(CDN)缓存是在 CDN 服务器上存储用户经常访问的静态资源。CDN 服务器分布在全球各地,当用户请求资源时,会从距离用户最近的 CDN 服务器获取资源。这些 CDN 服务器会缓存经常被请求的资源,从而减少了对源服务器的请求压力,加快了资源的获取速度。

(二)适用场景与优势

适用于各种类型的静态资源,如图片、CSS 文件、JavaScript 文件等。对于流量较大的网站或应用,CDN 缓存可以显著提高资源的分发速度,改善全球范围内用户的访问体验。例如,一个国际知名的电商网站可以利用 CDN 缓存来确保不同地区的用户都能快速加载商品图片和页面样式。

(三)缓存更新与同步问题

CDN 缓存的更新需要一定的时间来在各个 CDN 节点之间同步。当源服务器上的资源更新时,需要采取适当的策略(如缓存清除指令、版本控制等)来确保 CDN 缓存也能及时更新,以避免用户获取到旧版本的资源。

六、总结

前端常用的缓存技术在提升性能、优化用户体验方面各有其独特的作用。浏览器缓存通过在用户本地存储资源减少网络请求;本地存储为前端应用提供持久化或会话相关的数据存储;应用缓存支持离线应用;CDN 缓存则在全球范围内加速资源分发。开发人员需要深入理解这些缓存技术的原理、适用场景和局限性,根据应用的特点合理选择和组合使用缓存技术,并制定有效的缓存更新策略,以充分发挥缓存的优势,同时避免因缓存问题导致的用户体验下降或数据不一致等问题。在不断发展的前端技术环境中,缓存技术的合理应用将持续是优化前端应用的关键环节之一。

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

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

相关文章

gradle下载慢解决方案2024 /12 /1android studio (Windows环境)

gradle下载慢解决方案2024 /12 /1 默认环境配置好了,环境配置和程序安装请出门右转 打开软件,点击右上角设置,找到如下设置页 选择本地安装并制定好你已经安装好的 gradle 应用保存即可 全局插件环境配置(新版本可以直接在设置中添加了) 找对应位置添加国内源并把前面的内置源…

后端返回前端的数据量过大解决方案

后端返回前端的数据量过大解决方案 性能面板(Performance) chrome调试指南 原因 遇到一个页面有好几个表格,部分表格采用虚拟滚动条 数据量有点大 接近快60s了,看一下是哪里导致的慢 后台请求方法执行并不慢 2024-12-04 15:21:52.889 INFO 69948 …

在服务器上实现本地python文件的依赖

1、在python中,一个python文件就可以视为一个模块进行导入 2、使用import 导入时,若使用pip 下载过可以直接导入 3、假如是自己写的同项目中的文件会去sys.path 中查找 比如说 我现在 test 下有一个 python文件 运行 下面的代码 打印的数据如上图所示p…

Python酷库之旅-第三方库Pandas(255)

目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…

大数据新视界 -- Hive 元数据管理:核心元数据的深度解析(上)(27 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【网络安全】网站常见安全漏洞 - 网站基本组成及漏洞定义

文章目录 引言1. 一个网站的基本构成2. 一些我们经常听到的安全事件3. 网站攻击者及其意图3.1 网站攻击者的类型3.2 攻击者的意图 4. 漏洞的分类4.1 按来源分类4.2 按危害分类4.3 常见漏洞与OWASP Top 10 引言 在当今的数字化时代,安全问题已成为技术领域不可忽视的…

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智行无忧停车场管理系统(前后端源码 + 数据库 sql 脚本)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 项目介绍 1.1 项目功能 2.0 用户登录功能 3.0 首页界面 4.0 车辆信息管理功能 5.0 停车位管理功能 6.0 入场登记管理功能 7.0 预约管理功能 8.0 收费规则功能 9.0…

猎板 PCB特殊工艺:铸就电子行业核心竞争力新高度

在当今竞争激烈且技术驱动的电子制造领域,印制电路板(PCB)作为电子产品的关键基石,其特殊工艺的发展水平直接影响着整个行业的创新步伐与产品品质。猎板 PCB 凭借在厚铜板、孔口铺铜、HDI 板、大尺寸板以及高频高速板等特殊工艺方…

STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期

需求分析 上一个案例我们输出了PWM波,这个案例我们使用输入捕获功能,来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑,检查测试的结果。 如何测量 1、输入捕获功能主要是:测量输入通道的上升沿和下降沿 2、让第一个…

Android平台GB28181设备接入模块如何支持GB28181云端录像补录

技术背景 GB28181 的补录功能是一种用于弥补视频数据缺失的重要机制。在实际的视频监控场景中,由于网络不稳定、设备故障等多种因素,可能会导致视频数据在上云或存储过程中出现缺失,无法保证数据的完整性。GB28181 的补录功能就是为了解决这…

如何将python项目导出为docker镜像

如何将python项目导出为docker镜像 前提条件步骤 1: 创建并准备 Python 项目步骤 2: 创建 `setup.py`步骤 3: 打包项目步骤 4: 创建 Dockerfile步骤 5: 构建 Docker 镜像步骤 6: 运行 Docker 容器步骤 7: 保存修改并继续开发总结要将修改后的Python代码导出为 .tar.gz 格式,并…

Lua使用点号和冒号的区别

首先建立一个table,再分别定义两个方法,如下: local meta {}function meta:test1(...)print(self)print("")for k,v in pairs({...}) doprint(v)end endfunction meta.test2(...)print(self)print("")for k,v in pairs…

OpenGL ES详解——文字渲染

目录 一、文字渲染 二、经典文字渲染:位图字体 1.概念 2.优缺点 三、现代文字渲染:FreeType 1.着色器 2.渲染一行文字 四、关于未来 一、文字渲染 当你在图形计算领域冒险到了一定阶段以后你可能会想使用OpenGL来绘制文字。然而,可能…

【数据中心建设资料】数据中心安全建设解决方案,数据中心整理解决方案,数据中心如何做到安全保障,数据中台全方案(Word全原件)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏系统 1.3.8…

菲涅尔透镜加工:倚光科技的光学创新之路

在光学元件的广袤星空中,菲涅尔透镜以其独特的设计和卓越的性能闪耀着独特光芒。菲涅尔透镜通过将透镜表面由一系列同心棱纹组成,大幅减少了材料的使用量,却依然能够有效地汇聚或发散光线,在众多领域展现出无可比拟的优势&#xf…

OSCP:我理解的Web环境知识

你需要特别关注以下模块所涵盖的知识点,因为它们在考试中出现的概率很高。 1、SQL 注入(SQL Injection) ●允许攻击者注入自定义的、潜在恶意的 SQL 代码,由底层数据库执行。 ●可能导致数据泄露或目标服务器上的远程代码执行&…

flink-connector-mysql-cdc:01 mysql-cdc础配置代码演示

flink-connector-mysql-cdc: 01 mysql-cdc基础配置代码演示02 mysql-cdc高级扩展03 mysql-cdc常见问题汇总04 mysql-cdc-kafka生产级代码分享05 flink-kafka-doris生产级代码分享06 flink-kafka-hudi生产级代码分享 flink-cdc版本:3.2.0 flink版本&…

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序

高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数,把小于基准数的放到基准数的左边,把大于基准数的放到基准数的右边,采用 “ 分治算法 ”处理剩余元素,直到整个序列变为有序序列。 最好和平均的复杂度&#xff1a…

分类算法中的样本不平衡问题及其解决方案

一、样本不平衡问题概述 在机器学习的分类任务中,样本不平衡是指不同类别训练样本数量存在显著差异的现象。这一差异会给模型训练和性能评估带来挑战,尤其在处理少数类样本时,模型可能难以有效学习其特征。 以二分类为例,理想情况…

GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…