浏览器数据库 IndexedDB
出现很多久了,很多年前就听说过,中间也陆陆续续扫描过一些人写的文章,但是,但是都没有深入的去了解,今天是周日,趁还有时间,我们就来一起学习下它吧
浏览器支持简易的数据库,是偶然也是必然,随着浏览器功能的不断增长,越来越多的网站开始考虑在客户端上存储大量数据,这将减少从服务器获取数据并从本地获取数据
说是偶然,是因为浏览器端已经存在了大量的存储方式,比如 cookie
、localStorage
、sessionStorage
,再出一个 IndexedDB
类 MySQL 和 SQLite 显得不是那么的必要
说是必然,是因为它们都有缺陷,就是它们只能存储少量的数据,现有的浏览器数据存储解决方案不适合存储大量数据
-
cookie
能存储的最大数据不能超过4KB
,同时,每发起一个请求,同源下的所有未过期cookie
都会发送回浏览器,这是一个好的机制,尤其适合track
一些轨迹 -
localStorage
和sessionStorage
可以存储2.5MB
到10MB
之间的数据 (最大值取决于所使用的浏览器 ),它是一个键值对
数据存储方案,可以很快的设置和获取,但是却无法检索和搜索,也就是无法创建自定义索引
在这种情况下,一个新的解决方案呼之欲出,这也是 IndexedDB
诞生的背景
其实
IndexedDB
的出现有很多小插曲,当初争议非常大,而且替代方案也会层出不穷,呼声最高的应该是SQLite
吧
一般来讲,IndexedDB
是浏览器提供的本地数据库,但真正创建和操作它的却是来自服务器端的 JavaScript Web 脚本,这是一种非常有趣的方式,你可以想像成超市里的储物柜,谁都可以自由存储,也可以自由取走,除非管理员每次清点,要不东西都在哪里,其它情况下,管理员根本不会出现
IndexedDB
允许我们存储大量的数据并创建索引,它还提供搜索接口,这在 localStorage
中是不可能实现的
就数据库类型而言,IndexedDB
不是关系数据库 ( 不支持 SQL 查询语句 ) ,而是更接近 NoSQL
数据库
IndexedDB 特性
每次介绍一个新事物,介绍特性都成了一种必备的动作,这次也不例外,我们就来看看 IndexedDB
有哪些特性吧
-
使用 「 键值对 」 格式存储数据
IndexedDB
在内部使用 「 对象 」 ( object ) 来存储数据。所有类型的数据都可以直接存储,包括JavaScript 对象在一个存储对象中,数据以 「 键值对 」 的形式存储,每个数据记录都有自己对应的主键,主键是唯一的,不能重复,否则会引发错误
-
异步操作
所有的操作都是 「 异步 」( asynchronous ) 进行的,因此往
IndexedDB
中存储数据时不会锁定浏览器,用户仍然可以执行其它操作,这与LocalStorage
( 因为它是同步的 ) 形成对比异步设计是为了防止读取和写入大量数据,从而降低网页的性能
这是一个不用想也想不清楚的特性。不用想是因为操作
IndexedDB
时并不会感觉到浏览器停顿难用,想不清楚是因为,万一锁定了那时多么大的灾难,想想你一边看电影一边看股票,如果电影锁定操作IndexedDB
锁定了浏览器,你可能就错误是了成为亿万富翁的机会了 -
支持事务
IndexedDB
支持事务,意味一系列的操作中,只要一个步骤失败,那么所有的步骤都判定为失败,整个事务就会被取消,并且数据库将回滚到事务发生之前的状态因此,在使用事务的情况下,不用担心数据被损坏,也不用担心数据只写了一半
-
同源限制
上面我们将
IndexedDB
必做超市的储物箱,那么要怎么防止别人操作呢? 当然,就像储物箱的条码一样,IndexedDB
使用读写的域名作为凭据。也就是相同域名下的任何脚本都可以操作,其它域名下的脚本,哦,对不起,你是没任何权限的这种策略叫做同源限制,也就是根据域名限制操作
IndexedDB
受同源限制,每个数据库对应于创建它的域名,一个网页下的脚本只能访问自己域名下的数据库,而不能访问跨域数据库 -
存储空间大
不像超市的储物箱,放一台苹果笔记本都费劲,也不像
cookie
只有4kb
,IndexedDB
没有存储限制。只要你浏览器所在的临时存储足够大 ( 一般是 C 盘 ),它可以把地球都装下 -
支持二进制存储
支持二进制存储,也就是说支持直接存储图片数据,而不用做
base64
转码,还可以存储其它数据,比如ArrayBuffer
和Blob
对象
这么都特性,说的直白一点,就是: 「 操作简单,支持事务,足够安全,支持全数据格式 」
后记
纯理论的东西写起来特费劲,还好,可以有现实生活作为比喻,所以也还能结束
本章节就到这里吧,下一章节我们将详细介绍下 IndexedDB
的内部结构和一些术语概念之类的
怎么样? 是不是蠢蠢欲动...