MemTable
在讲memtable之前,有必要先讲讲leveldb模型,当向leveldb写入数据时,首先将数据写入log文件, 然后在写入memtable内存中。log文件主要是用在当断电时,内存中数据会丢失,数据可以从log文件中 恢复。当memtable数据达到一定大小即(options.write_buffer_size大小,默认4<<20),会变为 immemtable,然后log文件也生成一个新的log文件。immemtable数据将会被持久化到磁盘中。模型图如下:

MemTable实现
MemTable的实现为非线程安全的。 MemTable是基于引用计数的,每次使用需要首先调用Ref(),使用完毕时调用Unref()。
MemTable内部持有一个内存池Arena,其相关内存都有该内存池分配。 MemTable其实有一个SkipList实现的。SkipList持有的元素为const char *,也是由其内存池所分配的。 SkipList持有的元素的内存分布为:
| n (varint,key部分内存,含sequence) | key data (n-8 bytes) | sequence (8 bytes) | m (varint,val data) | val data (m bytes) |
可以看出key部分的内存结构为一个LookupKey的内存结构,其Get方法使用的key就是LookupKey。
拥有Add、Get和NewIterator方法。
Add将一组k-v存储在MemTable里;Get获取指定key的vale,当key的value type为kTypeDeletion时,返回NotFound;NewIterator返回一个iteration,遍历SkipList。
源码分析
文档信息
- 本文作者:Neal Hu
- 本文链接:https://lrita.github.io/2017/01/10/leveldb-source-4-memtable/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)