levelDb笔记
https://zhuanlan.zhihu.com/p/34665791
lvlDb:
1、为了持久化并且使写操作快速返回,先写wal;---内存中不存在脏数据(除了尚未完成写wal的新数据)都是干净数据 ---it:仅带sync的写马上将最新wal下盘
2、为了读,内存中缓存部分干净数据;
3、为了大块读写磁盘,磁盘数据是按块组织的;
4、为了方便下盘,内存缓存也是按块组织的;每满一个块,将其变成不可变块准备下盘;
5、为了便于查找,每个内存块和每个磁盘块中的数据都组织成有序的;
6、内存块下盘会与相应磁盘块进行“合并”,更新掉其中的旧数据;
7、为了节省磁盘空间,磁盘块会进行压缩(读时解压缩); ---leveldb自己缓存未压缩数据,os的fs自带缓存已压缩的文件中的数据
8、为了加速多个磁盘文件中的查找,将这些存储磁盘块的文件按照从新到旧顺序组织成level0~levelN,每一层也都是有序的。不同层可以有不同的块大小。每一层太多的时候就向下合并,然后删除自己(即每一层都要不断将部分旧数据下移以保持自己不会太大)。新的层不断生长出来,形成不断垒高的金字塔式的文件结构。
9、删除可视作一种特殊的写。
10、内存中只会存在部分新数据,磁盘中可能存在一些旧数据但它们不会被读出而是会逐渐被覆盖或删除掉。
主要模块:log,memtable, imutable, SST文件,以及管理记录SST文件的manifest文件,以及记录当前manifest文件的current文件。