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
。