浏览器数据库 IndexedDB 简明教程 ( 一 ) - 初识

yufei       6 年, 4 月 前       1340

浏览器数据库 IndexedDB 出现很多久了,很多年前就听说过,中间也陆陆续续扫描过一些人写的文章,但是,但是都没有深入的去了解,今天是周日,趁还有时间,我们就来一起学习下它吧

浏览器支持简易的数据库,是偶然也是必然,随着浏览器功能的不断增长,越来越多的网站开始考虑在客户端上存储大量数据,这将减少从服务器获取数据并从本地获取数据

说是偶然,是因为浏览器端已经存在了大量的存储方式,比如 cookielocalStoragesessionStorage,再出一个 IndexedDBMySQLSQLite 显得不是那么的必要

说是必然,是因为它们都有缺陷,就是它们只能存储少量的数据,现有的浏览器数据存储解决方案不适合存储大量数据

  1. cookie 能存储的最大数据不能超过 4KB ,同时,每发起一个请求,同源下的所有未过期 cookie 都会发送回浏览器,这是一个好的机制,尤其适合 track 一些轨迹

  2. localStoragesessionStorage 可以存储 2.5MB10MB 之间的数据 (最大值取决于所使用的浏览器 ),它是一个 键值对 数据存储方案,可以很快的设置和获取,但是却无法检索和搜索,也就是无法创建自定义索引

在这种情况下,一个新的解决方案呼之欲出,这也是 IndexedDB 诞生的背景

其实 IndexedDB 的出现有很多小插曲,当初争议非常大,而且替代方案也会层出不穷,呼声最高的应该是 SQLite

一般来讲,IndexedDB 是浏览器提供的本地数据库,但真正创建和操作它的却是来自服务器端的 JavaScript Web 脚本,这是一种非常有趣的方式,你可以想像成超市里的储物柜,谁都可以自由存储,也可以自由取走,除非管理员每次清点,要不东西都在哪里,其它情况下,管理员根本不会出现

IndexedDB 允许我们存储大量的数据并创建索引,它还提供搜索接口,这在 localStorage 中是不可能实现的

就数据库类型而言,IndexedDB 不是关系数据库 ( 不支持 SQL 查询语句 ) ,而是更接近 NoSQL 数据库

IndexedDB 特性

每次介绍一个新事物,介绍特性都成了一种必备的动作,这次也不例外,我们就来看看 IndexedDB 有哪些特性吧

  1. 使用 「 键值对 」 格式存储数据

    IndexedDB 在内部使用 「 对象 」 ( object ) 来存储数据。所有类型的数据都可以直接存储,包括JavaScript 对象

    在一个存储对象中,数据以 「 键值对 」 的形式存储,每个数据记录都有自己对应的主键,主键是唯一的,不能重复,否则会引发错误

  2. 异步操作

    所有的操作都是 「 异步 」( asynchronous ) 进行的,因此往 IndexedDB 中存储数据时不会锁定浏览器,用户仍然可以执行其它操作,这与 LocalStorage ( 因为它是同步的 ) 形成对比

    异步设计是为了防止读取和写入大量数据,从而降低网页的性能

    这是一个不用想也想不清楚的特性。不用想是因为操作 IndexedDB 时并不会感觉到浏览器停顿难用,想不清楚是因为,万一锁定了那时多么大的灾难,想想你一边看电影一边看股票,如果电影锁定操作 IndexedDB 锁定了浏览器,你可能就错误是了成为亿万富翁的机会了

  3. 支持事务

    IndexedDB 支持事务,意味一系列的操作中,只要一个步骤失败,那么所有的步骤都判定为失败,整个事务就会被取消,并且数据库将回滚到事务发生之前的状态

    因此,在使用事务的情况下,不用担心数据被损坏,也不用担心数据只写了一半

  4. 同源限制

    上面我们将 IndexedDB 必做超市的储物箱,那么要怎么防止别人操作呢? 当然,就像储物箱的条码一样,IndexedDB 使用读写的域名作为凭据。也就是相同域名下的任何脚本都可以操作,其它域名下的脚本,哦,对不起,你是没任何权限的

    这种策略叫做同源限制,也就是根据域名限制操作

    IndexedDB 受同源限制,每个数据库对应于创建它的域名,一个网页下的脚本只能访问自己域名下的数据库,而不能访问跨域数据库

  5. 存储空间大

    不像超市的储物箱,放一台苹果笔记本都费劲,也不像 cookie 只有 4kbIndexedDB 没有存储限制。只要你浏览器所在的临时存储足够大 ( 一般是 C 盘 ),它可以把地球都装下

  6. 支持二进制存储

    支持二进制存储,也就是说支持直接存储图片数据,而不用做 base64 转码,还可以存储其它数据,比如 ArrayBufferBlob 对象

这么都特性,说的直白一点,就是: 「 操作简单,支持事务,足够安全,支持全数据格式 」

后记

纯理论的东西写起来特费劲,还好,可以有现实生活作为比喻,所以也还能结束

本章节就到这里吧,下一章节我们将详细介绍下 IndexedDB 的内部结构和一些术语概念之类的

怎么样? 是不是蠢蠢欲动...

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.