← 中文资源

简体中文版本

构建带 WAL 的键值存储

一个持久键值存储:写前日志保持久性、内存索引快速查询、检查点限恢复时间。

阅读英文原文

项目概述

本项目实现带 WAL 的持久键值存储:写追加记录到写前日志、更新内存索引、fsync 后确认保持久性。点查询读内存索引 O(1) 无磁盘 IO。检查点写全索引到快照截断日志,恢复加载快照重放日志尾。原子多键事务追加 begin/记录/commit,仅 commit 时更新索引,崩溃前无 commit 跳过。测试 put 后崩溃恢复断言存在;delete 后断言不存在;检查点后写更多崩溃断言仅重放尾;事务 commit 后崩溃断言全在;未 commit 崩溃断言全不在;fsync 前崩溃断言不在;恢复两次幂等;并发写恢复后均在。部署单进程单文件;按计划或阈值检查点;批量写摊销 fsync;监控日志大小检查点率恢复时间。索引在内存超内存不可;无范围扫描;单进程。

架构与实施

构建带 WAL 的键值存储的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。

限制与后续

当前构建带 WAL 的键值存储实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整node:fs版本。

代码示例

pnpm init

pnpm add -D typescript tsx vitest
kv-store-wal/
├── src/store.ts
├── src/wal.ts
├── src/checkpoint.ts
├── tests/store.test.ts
└── package.json
await wal.append({op:"put", key, val}); index.set(key, val); await wal.sync();
return index.get(key);
await snapshot.write(index); await wal.truncate(upTo);
const snap = await snapshot.load(); for (const r of wal.tail()) apply(r, snap);
pnpm vitest run