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 存储是整个数据库领域的基石。
为了更好地理解 KV 数据库的定位,我们来做一个对比:
| 特性 | KV 数据库 | 关系型数据库 |
|---|---|---|
| 数据模型 | Key → Value,无结构约束 | 表、行、列,强 Schema |
| 查询方式 | 按 Key 精确查找 | SQL,支持复杂条件查询 |
| 性能 | 读写极快(通常 O(1) 或 O(log n)) | 查询灵活但开销较大 |
| 扩展性 | 天然适合水平扩展 | 水平扩展较复杂 |
| 适用场景 | 缓存、会话、配置、消息队列 | 业务系统、报表、事务处理 |
工业界有很多优秀的 KV 存储引擎,它们采用了不同的设计思路:
内存型 KV 数据库,提供丰富的数据结构(String、Hash、List、Set 等),单机可达 10w+ QPS,常用于缓存和实时计算。
基于 LSM-Tree 的嵌入式存储引擎,写入性能极高。RocksDB 被 Meta、字节跳动等公司广泛用于数据库底层(TiKV、CockroachDB)。
基于 B+ Tree 的嵌入式数据库,读性能优异,etcd 用 bbolt 作为底层存储,支撑 Kubernetes 集群管理。
基于日志追加写入的存储模型,结构简单、性能优秀,是我们本课程要从零实现的目标。
从底层数据结构的角度看,KV 存储引擎主要分为以下几种:
| 流派 | 代表 | 写入 | 读取 | 空间利用 | 复杂度 |
|---|---|---|---|---|---|
| B+ Tree | BoltDB, InnoDB | 中等(随机写) | 快(有序查找) | 高 | 中等 |
| LSM-Tree | LevelDB, RocksDB | 极快(顺序写) | 中等(多层查找) | 中等 | 高 |
| Bitcask | Riak Bitcask | 极快(顺序追加) | 快(一次 IO) | 中等 | 低 |
以 BoltDB、InnoDB(MySQL 的存储引擎)为代表。数据按照 Key 的顺序存储在 B+ Tree 中,读取时可以快速定位。
以 LevelDB、RocksDB 为代表。写入时先追加到内存中的 MemTable,然后批量刷盘并在后台做 Compaction。
Bitcask 是另一种思路,它比 LSM-Tree 更简单:所有数据追加写入日志文件,在内存中维护一个 Key → 磁盘位置的索引。
在接下来的课程中,我们将从零开始,用 Go、Rust、Java、C++ 四种语言实现一个完整的 Bitcask KV 存储引擎,并在此基础上不断扩展,最终实现一个兼容 Redis 协议的数据库。
整个课程共 27 章,前 3 章为理论基础,第 4 章开始编写代码,每一章对应一个 Git 提交,代码逐步累积。
在这一章中,我们了解了:
下一章我们将深入阅读 Bitcask 论文,理解它的完整设计。