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许可证)