基于 Bitcask 论文,从零实现一个完整的 KV 存储引擎。涵盖数据读写、编解码、索引设计、WriteBatch 原子写、Merge 数据清理等核心主题。
了解 KV 数据库的基本概念,对比关系型数据库的差异,认识 B+ Tree、LSM-Tree、Bitcask 三大存储引擎流派,理解 Bitcask「追加写日志 + 内存索引」的核心设计思想。
深入阅读 Bitcask 论文,理解数据文件、LogRecord 格式、KeyDir 内存索引、读写删流程、Merge 合并机制、Hint File 加速恢复等完整设计,为后续编码打下理论基础。
安装 Go / Rust / Java / C++ 开发环境,获取课程代码仓库,熟悉项目结构和构建测试命令,为动手编码做好准备。
定义 DB、DataFile、LogRecord、LogRecordPos 等核心数据结构,设计 Indexer 内存索引接口和 IOManager 磁盘 IO 接口,搭建项目骨架。
实现 Put 写入和 Get 读取的完整链路。Put 将数据追加写入活跃文件并更新内存索引,Get 通过内存索引定位数据在磁盘上的位置并读取。
实现 Open 函数的完整启动逻辑:校验配置、创建数据目录、加载数据文件、遍历 LogRecord 重建内存索引,确保重启后数据不丢失。
实现 Delete 操作的墓碑标记机制。追加 Type=Deleted 的记录并从内存索引中移除,理解 Bitcask 的惰性删除策略。
完整实现 DataFile 模块:基于 IOManager 接口进行文件读写,管理文件 ID 和写入偏移量,实现 ReadLogRecord、Sync、Close 等方法。
深入二进制编码格式:varint 变长编码压缩 KeySize/ValueSize,CRC32 校验数据完整性,处理 Header 变长带来的解析细节。
实现 Close/Sync 保证数据安全落盘,设计 Iterator 迭代器接口,支持 Rewind、Seek、Next 操作,利用 BTree 快照实现一致性遍历。
实现批量写入的事务机制。pendingWrites 缓存 → Commit 附加 seqNo → txn-fin 标记 → 批量更新索引,保证原子性。
Sync 并轮转活跃文件,遍历旧文件过滤有效数据,生成 Hint 索引文件加速重启,写入 merge-finished 标记完成原子切换。
引入 ART 自适应基数树和 B+Tree(bbolt)两种新索引实现,对比三种索引的适用场景与性能特征。
实现 MMap 内存映射加速启动索引加载,文件锁保证多进程互斥访问,BytesPerSync 累积写入量阈值触发刷盘,平衡写入性能与数据持久性。
优化 Merge 流程:索引接口返回旧值位置用于精确统计可回收空间,引入 DataFileMergeRatio 阈值和磁盘空间预检查,避免无效 Merge 操作,新增 Stat 接口暴露数据库运行状态。
实现数据库的备份与恢复功能,支持在线备份,确保数据安全。
为 KV 存储引擎提供 HTTP API,支持通过 RESTful 接口进行数据的增删改查操作。
编写基准测试,对比不同配置和索引类型下的读写性能,分析性能瓶颈并给出优化建议。
设计基于 KV 存储引擎的 Redis 兼容数据结构层,定义 String、Hash、Set、List、Sorted Set 的编码方案。
实现 Redis String 类型的 GET、SET、SETNX、GETDEL 等核心命令。
实现 Redis Hash 类型的 HSET、HGET、HDEL、HGETALL 等命令,基于 KV 编码存储字段。
实现 Redis Set 类型的 SADD、SREM、SISMEMBER、SMEMBERS 等集合操作命令。
实现 Redis List 类型的 LPUSH、RPUSH、LPOP、RPOP、LRANGE 等列表操作命令。
实现 Redis Sorted Set 类型的 ZADD、ZSCORE、ZRANGE 等有序集合命令,支持按分数范围查询。
实现 RESP 协议解析,让 KV 存储引擎可以直接使用 redis-cli 等标准 Redis 客户端进行交互。
推荐数据库、存储引擎相关的经典论文、书籍、开源项目,帮助你进一步深入学习。
梳理 KV 存储引擎相关的高频面试题,涵盖 Bitcask 原理、LSM-Tree 对比、并发控制、数据恢复等核心知识点。