CHAPTER 01

初识 KV 数据库

本章为理论基础,不涉及代码实现

1. 什么是 KV 数据库

KV(Key-Value)数据库是最简单也是最基础的数据存储模型。它的核心思想非常直观:每条数据由一个 Key(键)和一个 Value(值)组成,就像一本字典 —— 通过"单词"找到"释义"。

你可以用最简单的方式理解 KV 数据库提供的能力:

Put(key, value)   // 写入一条数据
Get(key) → value  // 根据 key 读取 value
Delete(key)       // 删除一条数据

这三个操作看起来简单,却是一切复杂存储系统的基石。Redis 是典型的内存 KV 数据库,LevelDB、RocksDB 是基于 LSM-Tree 的 KV 存储引擎,etcd 底层也是 KV 模型。甚至很多分布式 SQL 数据库,底层的存储引擎也是 KV 模型 —— CockroachDB 和 TiDB 都是将 SQL 表的行数据编码成 KV 对,再交给底层的 KV 引擎(RocksDB / Pebble)来存储。可以说,KV 存储是整个数据库领域的基石。

"user:1001" "session:abc" "config:db" {"name":"Alice","age":28} {"token":"x7k...","ttl":3600} {"port":3306,"pool":10} Key Value Core API Put(key, value) Get(key) → value Delete(key)
为什么 KV 模型如此重要?
关系型数据库(MySQL、PostgreSQL)虽然功能强大,但它们的底层存储引擎往往也是某种形式的 KV 结构。理解 KV 数据库,就是在理解存储系统的根基。

KV 数据库的实际应用随处可见:Redis 在电商系统中承担缓存和秒杀计数(单机可达 10w+ QPS);etcd 用 bbolt 作为底层存储,支撑整个 Kubernetes 集群的配置管理;RocksDB 被 Meta 用于服务数十亿用户的社交数据。

2. KV 数据库 vs 关系型数据库

为了更好地理解 KV 数据库的定位,我们来做一个对比:

特性KV 数据库关系型数据库
数据模型Key → Value,无结构约束表、行、列,强 Schema
查询方式按 Key 精确查找SQL,支持复杂条件查询
性能读写极快(通常 O(1) 或 O(log n))查询灵活但开销较大
扩展性天然适合水平扩展水平扩展较复杂
适用场景缓存、会话、配置、消息队列业务系统、报表、事务处理
KV 数据库不是要"替代"关系型数据库,而是在特定场景下提供更高效的解决方案。很多系统会同时使用两者 —— KV 做缓存和高频读写,关系型做复杂查询和事务。

3. 常见的 KV 存储引擎

工业界有很多优秀的 KV 存储引擎,它们采用了不同的设计思路:

Redis

内存型 KV 数据库,提供丰富的数据结构(String、Hash、List、Set 等),单机可达 10w+ QPS,常用于缓存和实时计算。

LevelDB / RocksDB

基于 LSM-Tree 的嵌入式存储引擎,写入性能极高。RocksDB 被 Meta、字节跳动等公司广泛用于数据库底层(TiKV、CockroachDB)。

BoltDB / bbolt

基于 B+ Tree 的嵌入式数据库,读性能优异,etcd 用 bbolt 作为底层存储,支撑 Kubernetes 集群管理。

Bitcask

基于日志追加写入的存储模型,结构简单、性能优秀,是我们本课程要从零实现的目标。

4. 存储引擎的三大流派

从底层数据结构的角度看,KV 存储引擎主要分为以下几种:

流派代表写入读取空间利用复杂度
B+ TreeBoltDB, InnoDB中等(随机写)快(有序查找)中等
LSM-TreeLevelDB, RocksDB极快(顺序写)中等(多层查找)中等
BitcaskRiak Bitcask极快(顺序追加)快(一次 IO)中等

B+ Tree 流派

以 BoltDB、InnoDB(MySQL 的存储引擎)为代表。数据按照 Key 的顺序存储在 B+ Tree 中,读取时可以快速定位。

LSM-Tree 流派

以 LevelDB、RocksDB 为代表。写入时先追加到内存中的 MemTable,然后批量刷盘并在后台做 Compaction。

Bitcask 模型

Bitcask 是另一种思路,它比 LSM-Tree 更简单:所有数据追加写入日志文件,在内存中维护一个 Key → 磁盘位置的索引。

为什么选择 Bitcask 作为教学项目?
Bitcask 的设计足够简洁,核心思想用一句话就能说清楚:追加写日志 + 内存索引。但麻雀虽小五脏俱全 —— 编解码、文件管理、索引、事务、合并清理、迭代器……这些存储引擎的核心概念在 Bitcask 中全部都能涉及到。它是学习存储引擎设计的绝佳起点。

5. 我们要做什么

在接下来的课程中,我们将从零开始,用 Go、Rust、Java、C++ 四种语言实现一个完整的 Bitcask KV 存储引擎,并在此基础上不断扩展,最终实现一个兼容 Redis 协议的数据库。

1
基本读写
Put / Get / Delete
2
数据持久化
写入磁盘,重启不丢失
3
启动恢复
从磁盘重建内存索引
4
数据迭代
按 Key 顺序遍历
5
原子批量写
WriteBatch 事务
6
数据合并
Merge 回收磁盘空间
7
多种索引
BTree / ART / B+Tree
8
性能优化
IO 优化、Merge 优化
9
进阶功能
备份、HTTP、基准测试
10
兼容 Redis
5 种数据结构 + 协议

整个课程共 27 章,前 3 章为理论基础,第 4 章开始编写代码,每一章对应一个 Git 提交,代码逐步累积。

1-3 理论基础
01初识 KV 数据库 02Bitcask 论文详解 03环境搭建
4-12 KV 数据库基础功能实现
04内存和磁盘设计 05数据读写流程 06数据库启动流程 07数据删除流程 08数据文件逻辑 09LogRecord 编解码 10Close/Sync/迭代器 11WriteBatch 原子写 12Merge 数据清理
13-15 优化篇
13内存索引优化 14文件 IO 优化 15数据 Merge 优化
16-18 备份、测试、HTTP
16数据备份 17HTTP 接口 18基准测试
19-25 Redis 数据结构和协议
19Redis 数据结构设计 20String 结构 21Hash 结构 22Set 结构 23List 结构 24Sorted Set 结构 25兼容 Redis 协议
26-27 加餐
26学习资料汇总 27面试要点

本章小结

在这一章中,我们了解了:

  1. KV 数据库是最基础的存储模型,提供 Put / Get / Delete 三个核心操作。
  2. 存储引擎有 B+ TreeLSM-TreeBitcask 三大流派,各有优劣。
  3. Bitcask 的核心思想:追加写日志 + 内存索引,写入快、读取也快、实现简单。
  4. 我们将用 Go、Rust、Java、C++ 四种语言从零实现一个完整的 Bitcask 引擎,并在此基础上实现兼容 Redis 协议的数据库。

下一章我们将深入阅读 Bitcask 论文,理解它的完整设计。