Leveldb源码阅读1
引言
一直听说这个项目的质量很高,终于来见识一下了。今天剩余时间不多,重在理清以下两个问题就行。
- 为什么会出现leveldb,谷歌怎么想到实现它的,它的作用是什么。
- leveldb的代码结构是什么样子,涉及到哪些熟悉或者不熟悉的知识点。
正文
Leveldb的特点
levelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++ 程序库。官方网站报道其随机写性能达到40万条记录每秒,而随机读性能达到6万条记录每秒。总体来说,LevelDb的写操作要大大快于读操作,而顺序读写操作则大大快于随机读写操作。
-
leveldb是一个持久化存储的KV系统,Redis是一种内存型的KV系统,因此leveldb对内存消耗少,大部分数据存储在磁盘上。
-
leveldb存储数据时,按照记录的key值有序存储,相邻的key值在存储文件中以此顺序存储,而应用可以自定义key大小笔记函数,leveldb可以按照用户定义的比较函数存储记录。
对redis了解过少,需要看看。
Redis是一个基于内存的键值存储系统,支持持久化,复制,事务等功能。它的数据存储在内存中,读写性能很高。常用于缓存,消息队列等场景。
Redis 和持久层数据库之间的数据一致性是由应用程序自己来控制的。应用程序会优先去缓存中获取数据,当缓存中没有数据时,应用程序需要从持久层加载数据,然后再放进缓存中。当数据更新发生时,需要将缓存置为失效。
leveldb是一个持久化存储的KV系统,使用SSD硬盘存储。具有高性能,稳定性好等特点,适用于大规模数据存储和快速查询的场景。
LevelDB 将 Redis 缓存和持久层合二为一,一次性帮你搞定缓存和持久层。
-
leveldb的操作接口和大多数KV系统一样,基本操作包括写记录,读记录,针对多条操作的原子批量操作等。
-
leveldb另外支持数据快照(读取操作不受写操作影响,可以在读时始终看到一致的数据),数据压缩(减少存储空间,增快io效率)等操作。
Leveldb的结构
静态结构
leveldb的静态结构主要有六个部分:
内存中:MemTable, Immutable MemTable
磁盘上:Current, Manifest, log, SSTable
leveldb是一种基于operation log的文件系统,是Log-Structured-Merge Tree的典型实现.
当op log文件大小超过限定值时,就定时做check point。Leveldb会生成新的Log文件和Memtable,后台调度会将Immutable Memtable的数据导出到磁盘,形成一个新的SSTable文件。SSTable就是由内存中的数据不断导出并进行Compaction操作后形成的,而且SSTable的所有文件是一种层级结构,第一层为Level 0,第二层为Level 1,依次类推,层级逐渐增高,这也是为何称之为LevelDb的原因。
基本操作
写入操作:当应用写入一条Key:Value记录的时候,LevelDb会先往log文件里写入,成功后将记录插进Memtable中,只涉及一次磁盘顺序和一次内存写入。
文件夹
-
db/ 文件夹:这是 LevelDB 的核心部分,包含数据库的主要功能,如数据存储、查找、更新、删除等。重点阅读
db_impl.cc
、version_set.cc
等文件,这些文件处理数据库的核心操作。 - table/ 文件夹:处理 SSTable 文件(LevelDB 的数据格式)。
table
模块管理数据的写入和读取,重要文件如block.cc
、table.cc
。 - util/ 文件夹:包含工具类和一些辅助功能的实现,如
env.cc
处理文件系统和操作系统的接口,coding.cc
包含编码和解码逻辑。 - port/ 文件夹:处理跨平台的细节实现,主要是系统相关的接口。如果不是做跨平台开发,可以略读。
Leveldb的基础知识
- Leveldb内部通过双向链表实现了一个标准版的LRUCache,内部自己实现了hashtable
- skip list是实现memtable的核心数据结构,memtable的KV数据都存储在skip list中
- log和LSM树
- util中的Arena内存池,CRC32,Random等
- 基本数据结构:slice,布隆过滤器,LRU
sum
大致看了以下,有几篇文章还挺不错的,估计先按照别人博客的思路走。(果然经典源码肯定会有大佬的博客分析,太赞了)
评价:各部分知识点讲解很全面,但是很少把源码拿出来分析,重在讲解思路
评价:知识不全面,但是整体框架很好,也联系了源码。
源码和图片都有,但是花里胡哨的字体代码排版),也可以看看。
只讲了leveldb的数据结构,可供参考。
最终决定自底而上看。因为还没看源码,先确立个大致路线,后面可能会有适当变化
include文件夹下面的是公共接口,db,table,util文件夹下的为leveldb的底层实现
slice — log(LSM) — memtable(skiplist) — sstable(Bloom Filter) — cache(LRU) — 基本操作(iterator) — compaction — read&write — version