【前端缓存】localStorage是同步还是异步的?为什么?

写在开头

点赞 + 收藏 === 学会

首先明确一点,localStorage是同步的

 一、首先为什么会有这样的问题

localStorage 是 Web Storage API 的一部分,它提供了一种存储键值对的机制。localStorage 的数据是持久存储在用户的硬盘上的,而不是内存。这意味着即使用户关闭浏览器或电脑,localStorage 中的数据也不会丢失,除非主动清除浏览器缓存或者使用代码删除。

当你通过 JavaScript 访问 localStorage 时,浏览器会从硬盘中读取数据或向硬盘写入数据。然而,在读写操作期间,数据可能会被暂时存放在内存中,以提高处理速度。但主要的特点是它的持久性,以及它不依赖于会话的持续性。

 二、硬盘不是io设备吗?io读取不都是异步的吗?

是的,硬盘确实是一个 IO 设备,而大部分与硬盘相关的操作系统级IO操作确实是异步进行的,以避免阻塞进程。不过,在 Web 浏览器环境中,localStorage 的API是设计为同步的,即使底层的硬盘读写操作有着IO的特性。

js代码在访问 localStorage 时,浏览器提供的API接口通常会处于js执行线程上下文中直接调用。这意味着尽管硬盘是IO设备,当一个js执行流程访问 localStorage 时,它将同步地等待数据读取或写入完成,该过程中js执行线程会阻塞。

这种同步API设计意味着开发者在操作 localStorage 时不需要考虑回调函数或者Promise等异步处理模式,可以按照同步代码的方式来编写。不过,这也意味着如果涉及较多数据的读写操作时,可能对性能产生负面影响,特别是在主线程上,因为它会阻塞UI的更新和其他js的执行。

 三、完整操作流程

localStorage 实现同步存储的方式就是阻塞 JavaScript 的执行,直到数据的读取或者写入操作完成。这种同步操作的实现可以简单概述如下:

  1. js线程调用: 当 JavaScript 代码执行一个 localStorage 的操作,比如 localStorage.getItem('key') 或 localStorage.setItem('key', 'value'),这个调用发生在 js 的单个线程上。
  2. 浏览器引擎处理: 浏览器的 js 引擎接收到调用请求后,会向浏览器的存储子系统发出同步IO请求。此时 js 引擎等待IO操作的完成。
  3. 文件系统的同步IO: 浏览器存储子系统对硬盘执行实际的存储或检索操作。尽管操作系统层面可能对文件访问进行缓存或优化,但从浏览器的角度看,它会进行一个同步的文件系统操作,直到这个操作返回结果。
  4. 操作完成返回: 一旦IO操作完成,数据要么被写入硬盘,要么被从硬盘读取出来,浏览器存储子系统会将结果返回给 js 引擎。
  5. JavaScript线程继续执行: js 引擎在接收到操作完成的信号后,才会继续执行下一条 js 代码。

在同步的 localStorage 操作期间,由于 js 的单线程性质,整个线程会阻塞,即不会执行其他任何js代码,也不会进行任何渲染操作,直到 localStorage 调用返回。

 四、localStorage限制容量都是因为同步会阻塞的原因吗?

  1. 资源公平分享:同一用户可能会访问大量不同的网站,如果没有限制,随着时间的积累,每个网站可能会消耗大量的本地存储资源。这样会导致本地存储空间被少数几个站点占用,影响到用户访问其他网页的体验。限制大小可以确保所有网站都有公平的存储机会。
  2. 防止滥用:如果没有存储限制,网站可能会滥用 localStorage,存储大量数据在用户的设备上,这可能导致设备存储空间迅速耗尽,也可能侵犯用户的隐私。
  3. 性能限制:如之前提到的,localStorage 的操作是阻塞的。如果网站能够存储大量数据,就会加剧读写操作对页面性能的影响。
  4. 存储效率:localStorage 存储的是字符串形式的数据,不是为存储大量或结构化数据设计的。当尝试存储过多数据时,效率会降低。
  5. 历史和兼容性:5MB 的限制很早就已经被大多数浏览器实现,并被作为一个非正式的标准被采纳。尽管现在有些浏览器支持更大的 localStorage,但出于跨浏览器兼容性的考虑,开发者通常会假设这个限制。
  6. 浏览器政策:浏览器厂商可能会依据自己的政策来设定限制,可能是出于提供用户更一致体验的角度,或者是出于管理用户数据的方便。

 五、那indexDB会造成滥用吗?

虽然它们提供了更大的存储空间和更丰富的功能,但确实潜在地也可能被滥用。但是与相比 localStorage 增加了一些特性用来降低被滥用的风险:

  1. 异步操作:IndexedDB 是一个异步API,即使它被用来处理更大量的数据,也不会像 localStorage 那样阻塞主线程,从而避免了对页面响应性的直接影响。
  2. 用户提示和权限:对于某些浏览器,当网站尝试存储大量数据时,浏览器可能会弹出提示,要求用户授权。这意味着用户有机会拒绝超出合理范围的存储请求。
  3. 存储配额和限制:尽管 IndexedDB 提供的存储容量比 localStorage 大得多,但它也不是无限的。浏览器会为 IndexedDB 设定一定的存储配额,这个配额可能基于可用磁盘空间的一个百分比或者是一个事先设定的限额。配额超出时,浏览器会拒绝更多的存储请求。
  4. 更清晰的存储管理:IndexedDB 的数据库形式允许有组织的存储和更容易的数据管理。用户或开发者可以更容易地查看和清理占用的数据。
  5. 逐渐增加的存储:某些浏览器实现 IndexedDB 存储时,可能会在数据库大小增长到一定阈值时,提示用户是否允许继续存储,而不是一开始就分配一个很大的空间。

 六、一个例子简单测试一下

其实也不用测,平时写的时候你也没用异步的方式写localStorage吧,我们这里简单写个例子

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><script>const testLocalStorage = () => {console.log("==========> 设置localStorage之前");localStorage.setItem('testLocalStorage', '我是同步的');console.log("==========> 获取localStorage之前");console.log('=========获取localStorage', localStorage.getItem('testLocalStorage'))console.log("==========> 获取localStorage之后");}testLocalStorage()</script>
</body></html>

 写在最后

如果您看到这里了,并且觉得这篇文章对您有所帮助,希望您能够点赞和收藏⭐支持一下作者,感谢!如果文中有任何不准确之处,也欢迎您指正,共同进步。感谢您的阅读,期待您的点赞和收藏⭐!


原文链接:
https://juejin.cn/post/7359405716090011659

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

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

相关文章

.Net添加了引用,仍然提示找不到命名空间

如图&#xff0c;MyStudy控制台程序引用了一个C#类库MyClassLibrary 代码里也能敲出来using MyClassLibrary&#xff0c;但是build时始终提示找不到命名空间MyClassLibrary 我检查了MyClassLibrary的Assembly&#xff0c;命名空间名称无误 又检查了MyStudy里的引用信息&#x…

Vue.js之MVVM设计模式

前言 看到招聘信息网站上有对MVVM框架经验的需求&#xff0c;刚好曾有过这方面的笔记&#xff0c;在复习的同时总结核心知识点分析给大家。 MVVM是可以实现View和Model的完全分离&#xff0c;通过ViewModel这个桥梁进行交互&#xff0c;然后ViewModel通过双向数据绑定把View层和…

Linux SDIO-WiFi 协议栈

Linux SDIO-WiFi 协议栈 1. 简介2. BCMDHD2.1 WiFi模组2.2 驱动初始化&#xff08;dhd_module_init&#xff09; 3. Broadcom fullmac WLAN 1. 简介 2. BCMDHD BCMDHD&#xff1a;Broadcom Dongle Host DriverSIP&#xff1a;System In Package 2.1 WiFi模组 2.2 驱动初始化…

web server apache tomcat11-12-SSL/TLS Configuration

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

Java、Tomcat、Apache HTTP Server以及浏览器服务器的关系

一.浏览器服务器有哪些 浏览器服务器是指在互联网上扮演服务器角色的设备或程序&#xff0c;用于响应浏览器发出的请求并向浏览器返回相应的数据。 常见的浏览器服务器有以下几种&#xff1a; Apache HTTP Server&#xff1a;这是世界上最常用的web服务器软件之一&#xff0c;…

spring DisposableBean作用,在spring Bean销毁时的钩子 以及@PreDestroy

DisposableBean 作用 在Spring框架中&#xff0c;DisposableBean是一个接口&#xff0c;它定义了一个单一的方法&#xff0c;用于在Spring容器关闭时或一个由Spring管理的Bean不再需要时执行特定的清理操作。当一个Bean实现了DisposableBean接口&#xff0c;Spring容器会在销毁…

Windows创建类似Linux软连接、Windows软连接、快捷方式

Windows创建软连接 mklink 在 Windows 系统上&#xff0c;可以使用 mklink 命令来创建类似 Linux 的软连接&#xff0c;也称为符号链接。软连接是一种指向另一个文件或目录的链接&#xff0c;它允许您使用不同的名称来访问相同的文件或目录。与快捷方式不同&#xff0c;软连接…

Integer缓存池知道吗?

因为根据实践发现大部分的数据操作都集中在值比较小的范围&#xff0c;因此Integer搞了个缓存池&#xff0c;默认范围是-128到127&#xff0c;可以根据通过设置JVM-XX: AutoBoxCacheMax <size>来修改缓存的最大值&#xff0c;最小值改不了。 实现的原理是int在自动装箱…

IntelliJ IDEA - 10 款 IDEA 宝贝插件,YYDS!

好久没发这种实用贴了&#xff0c;最近用到了一些能提升工作效率的IDEA插件&#xff0c;给小伙伴们分享一下。相信我&#xff0c;我分享的这些插件&#xff0c;都是实实在在能解决实际开发场景中痛处的。 1、POJO to JSON 开发工作中&#xff0c;常常在设计完API后&#xff0c…

【每日算法】理论:深度学习基础 刷题:栈与队列的转换

上期文章 【每日算法】理论&#xff1a;深度学习基础 刷题&#xff1a;KMP算法思想 文章目录 上期文章一、上期问题二、本期理论问题1、RAW图像和RGB图像的区别&#xff1f;2、LSTM模型3、卷积层和池化层有什么区别4、tokenizer 的分词方法有那些&#xff1f;5、10亿个参数的模…

FPGA实现AXI4总线的读写_如何写axi4逻辑

FPGA实现AXI4总线的读写_如何写axi4逻辑 一、AXI4 接口描述 通道信号源信号描述全局信号aclk主机全局时钟aresetn主机全局复位&#xff0c;低有效写通道地址与控制信号通道M_AXI_WR_awid[3:0]主机写地址ID&#xff0c;用来标志一组写信号M_AXI_WR_awaddr[31:0]主机写地址&…

Nest.js项目初始配置

1.全局安装nest pnpm add -g nestjs/cli nodemon ts-node 2.创建nest项目 nest new project-name 3.安装依赖 pnpm add prisma-binding ts-node prisma/client mockjs nestjs/config class-validator class-transformer argon2 nestjs/passport passport passport-local n…

如何一键清除文件目录下所有的node_modules

如何一键清除文件目录下所有的node_modules 快速删除目录下的node_modules&#xff0c;下面附上windows和mac的脚本指令 windows脚本 FOR /d /r . %d in (node_modules) DO IF EXIST "%d" rm -rf "%d"mac脚本 find . -name "node_modules" -…

最短路问题之Bellman-Ford,SPFA算法,例题 负环

Bellman-Ford算法&#xff1a; Bellman-Ford算法用于解决带有负权边的单源最短路径问题。其基本思想是通过不断地松弛边来逐步求解最短路径。算法的主要步骤如下&#xff1a; 初始化&#xff1a;将源点到各个顶点的距离初始化为无穷大&#xff0c;源点的距离初始化为0。重复更…

JavaScript 变量 及 案例练习

变量 一. 变量是什么: 问题1: 用户输入的数据我们如何存储起来? 答案1: 使用变量 理解变量是如何存储数据的 “容器” **变量: ** 白话: 变量就是一个装东西的盒子通俗: 变量是计算机中用来存储数据的 “容器” , 它可以让计算机变得有记忆注意: 变量不是数据本身, 它们仅…

IDEA2023版本创建Sping项目无法使用Java8

1. 问题复现 1.1 当前版本2023.3.2 1.2 创建项目时&#xff1a;不存在jdk8选项 提示报错 1.3 原因分析 Spring官方发布Spring Boot 3.0.0 的时候告知了一些情况&#xff0c;Java 17将成为未来的主流版本 2. 如何解决 2.1 替换创建项目的源 我们只知道IDEA页面创建Spring项目…

对Java未来的发展趋势和新技术的看法

Java作为一种广泛使用的编程语言&#xff0c;已经走过了数十年的历程&#xff0c;其在企业级应用开发、大数据处理、云计算等多个领域都发挥着重要作用。随着技术的不断进步&#xff0c;Java也在不断发展&#xff0c;呈现出一些新的趋势和新技术。以下是对Java未来发展趋势和新…

Mysql 的char 和varchar的的区别

1、char 和varchar 区别 下面以utf8字符集为例&#xff0c;char和varchar的占比计算&#xff0c;如下图 valueChar(5)bytesVarchar(5)bytesVarchar(100&#xff09;bytes‘’‘ ’15‘’1‘’1‘abcd’‘abcd ’15‘abcd’13‘abcd’13abcdeabcde15abcde16abcde16 varchar使用…

【PHP快速上手(十四)】

目录 PHP快速上手&#xff08;十四&#xff09;PHP 中常用数据库操作使用 WHERE 子句进行条件查询使用 ORDER BY 子句进行排序使用 UPDATE 语句更新数据使用 DELETE 语句删除数据执行事务总结 PHP快速上手&#xff08;十四&#xff09; PHP 中常用数据库操作 当使用 PHP 中的…

NumPy 1.26 中文文档翻译完成

NumPy 1.26 中文文档NumPy 用户指南开始入门什么是 NumPy&#xff1f;NumPy 快速开始NumPy: 绝对初学者的基础知识基础与用法NumPy 基础知识MATLAB 用户的 NumPyNumPy 特性NumPy 如何操作高级用法和互操作性从源码编译使用 NumPy C-APIF2PY 用户指南和参考手册开发人员的底层文…