KV 存储,即键值数据存储,是一种基于键值对的存储方式,它将数据存储为一个由键和值组成的二元组,其中键(key)是一个唯一的标识符,值(value)是与这个 key 相关联的数据,KV 存储的应用场景很多,比如用作数据库的缓存层、分布式系统中元数据的存储、分布式锁等,当然一些数据库的底层也会有存储的模块,例如 Postgres 或者 MySQL。KV 存储,即键值数据存储,是一种基于键值对的存储方式,它将数据存储为一个由键和值组成的二元组,其中键(key)是一个唯一的标识符,值(value)是与这个 key 相关联的数据,KV 存储的应用场景很多,比如用作数据库的缓存层、分布式系统中元数据的存储、分布式锁等,当然一些数据库的底层也会有存储的模块,例如 Postgres 或者 MySQL。
对大多数开发者来说,最熟悉的 KV 存储产品应该是 Redis 了,但我们这里说的 KV 存储和 Redis 不太一样,因为 Redis 是一种基于内存的 KV 数据库,虽然它也有一些持久化的策略例如 AOF 和 RDB,但从本质上来说它还是面向内存进行设计的,数据的持久性并不能完全得到保证。
当然,最关键的是 Redis 的数据量受限于内存,而基于磁盘的 KV 存储,可以处理远超内存容量的数据,并且在性能上依然可以很强悍,这就是为什么 KV 存储价值巨大,也非常的受欢迎。
一般来说 KV 数据库的数据组织存储模型大致分为了两种,一个是 B+ 树,一个是 LSM 树,基于 B+ 树的项目比较著名的有 BoltDB,而充分利用顺序 IO、写性能更优的 LSM Tree 存储模型在近些年更加的受欢迎,其中最具有代表性的项目有 LevelDB、RocksDB。
LevelDB 应该是最早实践 LSM 存储模型的存储项目了,由 Google 的传奇大神 Jeff Dean 开发,后来 Facebook 基于 LevelDB,对其进行了一系列的优化,总体还是保留了 LevelDB 的存储模型,只是增加了更多的特性,例如支持更完善的事务处理、并发 compaction、高级压缩算法等,并且拥有更高的性能,在处理较大数据量时表现优异。
所以越来越多的产品采用 RocksDB 作为它们的存储引擎,例如 MyRocks 使用 RocksDB 给 MySQL 作为存储引擎,意在取代 InnoDB,CockroachDB 也使用 rocksdb 作为它的存储引擎,也有很多基于 RocksDB 构建分布式 KV 的项目,例如 PingCAP 的 TiKV。
KV 存储从设计上来说是数据库的各个组件当中比较简单的,从这里入手,可以显著的降低入门数据库内核开发的门槛,提升我们的学习热情。并且可以让我们对数据库的基础设计有一些了解,例如如何在磁盘上组织数据,如何拥有更加高效的读写性能,这些都是数据库中比较核心的一些设计要点。