leveldb源码分析

1. leveldb内存table的数据结构基础是skip-list:

1.1. skip-list和红黑树通常用作存储引擎的内存索引数据结构。

(1)skip-list相比于红黑树实现简单,在很多场景下都可以达到与红黑树相当的检索效率。

(2)skip-list对于高并发场景更加有优势,因为红黑树的无锁版本实现很复杂,而skip-list很容易通过CAS原理实现无锁。

(3)加锁的情况下,skip-list的锁范围可以更小,红黑树由于插入操作过程中的reblance过程可能会锁住更大的范围。

(4)skip-list只需要处理多个写线程之间的同步,对于1写多读的情况无需进行额外的同步处理,因为读要么读到的是写之后的结果,要么读到的是写之前的结果。而红黑树对于1写多读的情况仍然需要进行同步处理,因为reblance过程会导致读有可能读到写的中间数据。


1.2. leveldb通过memory barrier的方法实现了节点向后指针的原子操作,读无需额外同步,写是通过加锁的方式实现的同步,而没有采用效率更高的lock free skip-list。而redis由于是单进程单线程模型,所以不涉及skip-list的线程间同步的问题。


2. leveldb使用了bloom filter用作cache检查:

2.1. bloom filter通过bitmap作为基础在内存中做key是否存在的检查,可以大大节省内存空间。

2.2. bloom filter检查不存在则一定不存在,bloom filter检查存在则有小概率的不存在的可能性。


3. leveldb的读流程:

3.1. 先读memtable,再度immutable,最后读sstable set。


4. 大小端对齐:

4.1. leveldb中整型转字符数组使用的是大端对齐。

4.2. 大小端对齐的优缺点:




你可能感兴趣的:(源码剖析)