leveldb源码分析-4-MemTable

2017/01/10 leveldb

MemTable

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

memtable

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

拥有AddGetNewIterator方法。

  • Add将一组k-v存储在MemTable里;
  • Get获取指定key的vale,当key的value type为kTypeDeletion时,返回NotFound
  • NewIterator返回一个iteration,遍历SkipList

源码分析

memtable.h
memtable.cc

Search

    Table of Contents