元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
浏览器架构概览
多进程架构设计
浏览器内核组成
进程间通信机制
沙箱安全机制
浏览器加载页面流程
▶
渲染引擎原理
HTML解析算法
CSSOM构建过程
布局计算原理
图层合成机制
重绘与回流优化
▶
JavaScript引擎
V8执行流水线
事件循环机制
内存管理策略
JIT编译原理
垃圾回收算法
▶
网络栈实现
HTTP协议栈
缓存机制详解
资源加载策略
WebSocket实现
网络安全机制
▶
浏览器存储
Cookie管理机制
Web Storage实现
IndexedDB原理
缓存存储策略
▶
浏览器安全
同源策略实现
发布时间:
2025-03-23 16:02
↑
☰
# IndexedDB原理解析 ## 概述 IndexedDB是一个低级API,用于客户端存储大量结构化数据。它是一个事务型的数据库系统,基于JavaScript面向对象数据库。本文将详细介绍IndexedDB的实现原理和使用方法。 ## 基本概念 ### 1. 数据库模型 #### 对象存储 ```javascript // 创建对象存储空间 class IndexedDBStore { constructor(dbName, version) { this.dbName = dbName; this.version = version; this.db = null; } async open() { return new Promise((resolve, reject) => { const request = indexedDB.open(this.dbName, this.version); request.onerror = () => { reject(request.error); }; request.onsuccess = () => { this.db = request.result; resolve(this.db); }; request.onupgradeneeded = (event) => { const db = event.target.result; // 创建对象存储空间 if (!db.objectStoreNames.contains('users')) { const store = db.createObjectStore('users', { keyPath: 'id', autoIncrement: true }); // 创建索引 store.createIndex('name', 'name', { unique: false }); store.createIndex('email', 'email', { unique: true }); } }; }); } } ``` #### 索引结构 ```javascript // 索引管理 class IndexManager { constructor(store) { this.store = store; } createIndex(indexName, keyPath, options = {}) { if (!this.store.indexNames.contains(indexName)) { this.store.createIndex(indexName, keyPath, options); } } async queryByIndex(indexName, value) { return new Promise((resolve, reject) => { const index = this.store.index(indexName); const request = index.getAll(value); request.onsuccess = () => { resolve(request.result); }; request.onerror = () => { reject(request.error); }; }); } } ``` ### 2. 事务处理 #### 事务类型 ```javascript // 事务管理器 class TransactionManager { constructor(db) { this.db = db; } // 只读事务 async read(storeName, callback) { const transaction = this.db.transaction(storeName, 'readonly'); const store = transaction.objectStore(storeName); try { await callback(store); await this.complete(transaction); } catch (error) { transaction.abort(); throw error; } } // 读写事务 async readWrite(storeName, callback) { const transaction = this.db.transaction(storeName, 'readwrite'); const store = transaction.objectStore(storeName); try { await callback(store); await this.complete(transaction); } catch (error) { transaction.abort(); throw error; } } // 等待事务完成 complete(transaction) { return new Promise((resolve, reject) => { transaction.oncomplete = () => resolve(); transaction.onerror = () => reject(transaction.error); transaction.onabort = () => reject(transaction.error); }); } } ``` #### 并发控制 ```javascript // 并发控制 class ConcurrencyControl { constructor() { this.locks = new Map(); } async acquireLock(key, mode = 'shared') { while (this.isLocked(key, mode)) { await this.wait(100); } this.locks.set(key, { mode, timestamp: Date.now() }); } releaseLock(key) { this.locks.delete(key); } isLocked(key, mode) { const lock = this.locks.get(key); if (!lock) return false; if (mode === 'exclusive') { return true; } return lock.mode === 'exclusive'; } wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } } ``` ## 实现机制 ### 1. 数据操作 #### CRUD操作 ```javascript // 数据操作接口 class DataOperations { constructor(store) { this.store = store; } async create(data) { return new Promise((resolve, reject) => { const request = this.store.add(data); request.onsuccess = () => { resolve(request.result); }; request.onerror = () => { reject(request.error); }; }); } async read(key) { return new Promise((resolve, reject) => { const request = this.store.get(key); request.onsuccess = () => { resolve(request.result); }; request.onerror = () => { reject(request.error); }; }); } async update(key, data) { return new Promise((resolve, reject) => { const request = this.store.put(data); request.onsuccess = () => { resolve(request.result); }; request.onerror = () => { reject(request.error); }; }); } async delete(key) { return new Promise((resolve, reject) => { const request = this.store.delete(key); request.onsuccess = () => { resolve(); }; request.onerror = () => { reject(request.error); }; }); } } ``` #### 查询优化 ```javascript // 查询优化器 class QueryOptimizer { constructor(store) { this.store = store; } // 范围查询 async range(indexName, lower, upper, options = {}) { const index = this.store.index(indexName); const range = IDBKeyRange.bound(lower, upper, options.lowerExclusive, options.upperExclusive ); return new Promise((resolve, reject) => { const request = index.getAll(range); request.onsuccess = () => { resolve(request.result); }; request.onerror = () => { reject(request.error); }; }); } // 游标遍历 async cursor(callback, options = {}) { return new Promise((resolve, reject) => { const request = this.store.openCursor(); let count = 0; request.onsuccess = () => { const cursor = request.result; if (cursor && (!options.limit || count < options.limit)) { callback(cursor.value); count++; cursor.continue(); } else { resolve(); } }; request.onerror = () => { reject(request.error); }; }); } } ``` ### 2. 版本管理 #### 架构升级 ```javascript // 版本管理器 class VersionManager { constructor(dbName) { this.dbName = dbName; this.migrations = new Map(); } addMigration(version, callback) { this.migrations.set(version, callback); } async upgrade(oldVersion, newVersion, db) { for (let version = oldVersion + 1; version <= newVersion; version++) { const migration = this.migrations.get(version); if (migration) { await migration(db); } } } // 示例迁移 static sampleMigrations() { const manager = new VersionManager('myDB'); // 版本1:创建用户表 manager.addMigration(1, (db) => { const store = db.createObjectStore('users', { keyPath: 'id', autoIncrement: true }); store.createIndex('email', 'email', { unique: true }); }); // 版本2:添加用户名索引 manager.addMigration(2, (db) => { const store = db.transaction('users', 'readwrite') .objectStore('users'); store.createIndex('username', 'username', { unique: false }); }); return manager; } } ``` #### 数据迁移 ```javascript // 数据迁移工具 class DataMigration { constructor(oldDb, newDb) { this.oldDb = oldDb; this.newDb = newDb; } async migrateStore(storeName, transform = null) { const oldStore = this.oldDb.transaction(storeName).objectStore(storeName); const newStore = this.newDb.transaction(storeName, 'readwrite') .objectStore(storeName); return new Promise((resolve, reject) => { oldStore.openCursor().onsuccess = (event) => { const cursor = event.target.result; if (cursor) { let data = cursor.value; if (transform) { data = transform(data); } newStore.put(data); cursor.continue(); } else { resolve(); } }; }); } // 数据转换示例 static transformExample(oldData) { return { ...oldData, lastModified: Date.now(), version: 2 }; } } ```