IndexedDB是浏览器中实现大容量结构化本地缓存最成熟可靠的方案,具备事务、索引、版本控制和异步能力,适用于缓存日志、文章、聊天记录等;需按规范设计对象仓库、主键、索引,所有操作须在事务中完成,结构变更仅限onupgradeneeded,大数据写入须分批且让出主线程,查询与清理需结合索引和TTL策略。

IndexedDB 是目前浏览器中实现大容量结构化本地缓存最成熟、最可靠的方案。它不是“加大版 localStorage”,而是一套具备事务、索引、版本控制和异步能力的轻量级客户端数据库,天然适合缓存用户行为日志、离线文章、聊天记录、表单草稿、媒体元数据等结构化内容。
明确设计目标:缓存 ≠ 简单存取
本地缓存的核心诉求是:可查、可更新、可清理、不阻塞界面、失败有降级。IndexedDB 能满足全部,但需要按规范组织:
- 用 对象仓库(Object Store) 代替“键值对”,比如建一个
articles仓库存文章标题、发布时间、HTML 内容、阅读状态 - 主键(
keyPath)建议用业务唯一字段(如id),避免依赖自增;若无自然主键,可用autoIncrement: true自动生成 - 为高频查询字段建 索引,例如按
category分类列表、按updatedAt排序展示,避免全量遍历 - 所有读写必须包裹在 事务(transaction) 中,读用
readonly,写用readwrite,避免并发冲突
初始化与版本管理要一次到位
数据库首次打开或版本号变更时触发 onupgradeneeded,这是定义结构的唯一时机:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 不要在
onsuccess里创建对象仓库——会报错 - 每次升级版本号(如从 1 → 2),才能新增/删改仓库或索引;旧数据自动保留,新结构只对后续操作生效
- 示例:缓存带过期时间的数据,可在 v2 版本中为
cache仓库存加expiresAt字段并建索引,便于定时清理
写入大量缓存数据要批量+分片
一次性 put 几千条记录会卡顿 UI,正确做法是:
立即学习“Java免费学习笔记(深入)”;
- 用 单个 readwrite 事务 批量写入,而不是每条开一个事务
- 把数据切分成 100–500 条/批,每批写完用
setTimeout或requestIdleCallback让出主线程 - 避免直接存原始大 Blob(如整张图片),优先存 URL + 元信息;真需存二进制,IndexedDB 原生支持
Blob和ArrayBuffer
查询与清理要有策略
缓存不是“扔进去就完事”,得能高效取、智能删:
- 查单条:用
objectStore.get(key) - 按条件查:用索引 +
openCursor或index.getAll(IDBKeyRange.bound(...)) - 定期清理:建立
createdAt或accessedAt字段,配合索引做 LRU 或 TTL 清理 - 空间预警:监听
QuotaExceededError,触发降级(如转存内存或提示用户清理)

















