资讯专栏INFORMATION COLUMN

存储引擎及如何选择合适的存储 API

TIGERB / 2855人阅读

摘要:概述每当设计网页程序的时候,为本地设备选择合适的存储机制尤为重要。一个好的存储引擎可以帮助开发人员有效地存储数据,减少传输带宽及提高程序的响应速度。数据模型数据存储模型决定了其内部是如何组织存储数据的。

原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland。

本系列持续更新中,Github 地址请查阅这里。

这是 JavaScript 工作原理的第十六章。

概述

每当设计网页程序的时候,为本地设备选择合适的存储机制尤为重要。一个好的存储引擎可以帮助开发人员有效地存储数据,减少传输带宽及提高程序的响应速度。正确的存储缓存策略是构建移动端离线网页体验的核心组成部分,越来越多的用户想当然以为可以离线使用移动端网页程序。

本章,我们将讨论各种可用的存储 API 和服务,并提供一些在构建网页程序时如何正确地选择存储引擎的建议。

数据模型

数据存储模型决定了其内部是如何组织存储数据的。这会影响到整个网页程序的设计,并计算出为获取高性能网页程序及解决其所遇到的问题所需要的代价。没有所谓更好的技术和一刀切的解决方案,因为所有的问题都是工程学相关的问题。那么,让我们来瞧瞧可供选择的数据模型吧:

结构型:以预定义字段将数据存储于表中,因其为典型的基于 SQL 的数据库管理系统,所以可以很好地适应灵活和动态的数据查询。IndexedDB 即浏览器端结构型数据库的一个典型例子。

键/值型:键/值数据存储及关系型 NoSQL 数据库,允许开发者通过唯一键索引来存储和获取非结构型数据(即非预定数据类型的字段的数据)。键/值数据存储就像哈希表存储,意及其允许在一定时间内访问索引的不定数据类型的数据。键/值数据型存储的很好的例子有浏览器端的 Cache API 和 服务器端 Apache Cassandra。

字节流型:这一简单的模型把数据存储为定长,混淆字符串的字节变量,让应用层来控制其内部数据组织。该模型尤其适合于文件存储和其它层次型组织的 blob 数据。字节流存储的典型例子包括文件系统和云存储设备。

持久性

网页程序的数据存储方法可以以数据的存储时长来进行分析:

会话持久性:仅当活动的单个网页会话或者浏览器选项卡时数据有效,关闭即失效。会话持久性数据存储一个例子即 Session Storage API。

设备持久性:该类数据存储于指定设备的跨会话和浏览器选项卡/窗口有效。设备持久性存储机制的一个例子即 Cache API。

全局持久性:该类数据跨会话和设备存储。因此,它是兼容性最好的数据持久性方案。它不会存储于设备上,这意味着需要从服务端存储中获得数据。因为这里只讨论针对设备的数据存储,所以这里只是稍微提下服务端数据存储。

客户端数据持久性

现如今,有相当多的浏览器 API 可供选择用于存储数据。这里将详细讨论这些方法,然后对其进行比较以便让开发者轻松地选择正确的数据存储方案。

然而,首先在选择如何存储数据之前,开发者需要考虑几件事情 。当然了,第一件事即必须想清楚打算如何使用网页程序及之后的维护和性能优化。即使胸有成竹,可代选择的方案可能只有几个。以下为开发者需要考虑的问题:

浏览器支持-优先考虑标准化和组织良好的 API,因为这些 API 不会轻易变动且兼容性好。这些 API 同样有非常丰富的文档和活跃的开发者社区。

事务-有时候,事务对于相关的数据存储操作集原子化成功或失败至关重要。传统数据库使用事务模型来实现该功能,在事务模型中以把相关数据更新划分为任意的单元。

同步/异步-少数存储 API 是同步的意即存储或者检索数据请求会阻塞当前活跃线程直到数据请求结束。使用同步数据存储 API 会阻塞主线程且会让程序界面假死。尽量使用异步存储 API。

对比

这里,让我们浏览一下网页开发者当前可用的 API 并使用上述的几个维度来进行比较。