不让 pip install 任何东西?我用零依赖从零造了个防崩溃数据库
来源:dev.to — 2026-09-05
📋 概述
为了参加 Zero Dependency 挑战(依赖清单必须为空),作者不得不放弃惯用的 TinyDB,仅靠 Python 标准库从零实现了 ChronicleKV——一个带真实写前日志(WAL)、崩溃恢复与时间点历史的内嵌键值存储。深入后他发现 TinyDB 之所以「简单」是因为它只是把 JSON 文件dump到磁盘:没有 WAL、没有校验和,写入在错误时机被打断就可能得到无法解析的 JSON,且毫无恢复路径。ChronicleKV 的核心是 WAL:每条写都追加为带 CRC32 校验和与固定头部的二进制记录,启动时从头重放,遇到校验和失配处即认定是进程死于半写、截断丢弃——「恢复停在最后一次好写入」而非损坏的数据库。
🔑 核心要点
- ChronicleKV 的核心是写前日志(WAL):每条写用 struct.pack 编码成带 magic/版本/操作类型/序号/时间戳/长度头部加 zlib.crc32 校验和的记录,启动时重放即可自愈
- CRC 是整个设计的关键:校验和失配的那条记录正是进程死在写半途的位置——之前全有效、之后全截断,得到的是「恢复停在最后一次好写入」而非损坏文件
- 作者不信任自己,写了 crash-demo 工具真的 fork 出写进程并在随机点杀掉:sync 模式下每次运行零丢失,async 模式平均每场事故丢 37–50 条写
- 由纯追加日志白赚了「时间旅行」功能:db.get_at(key, seq=42) 可读任意时刻值,diff 与 timeline 等价于给数据做 git log——这并非作业要求而是设计副产品
- 零依赖让他真正看懂每个被省掉的库:argparse 子命令够用、fcntl.flock 提供单写者语义(Windows 无干净等价物故诚实标注回退)、unittest 顶掉 pytest 的 fixtures
💡 金句
不要把「零依赖」当成要绕开的限制——它逼着你去真正理解那个依赖当初是为什么存在的。我一直知道 TinyDB 很「简单」,但直到我不得不亲手写 fsync 调用,才真正想清楚它在静默地不给我哪些持久性保证。
👍 0
👎 0
← 返回 dev.to 首页