LevelDb之五:MemTable详解

       LevelDb日知录前述小节大致讲述了磁盘文件相关的重要静态结构本小节讲述内存中的数据结构MemtableMemtable在整个体系中的重要地位也不言而喻总体而言所有KV数据都是存储在MemtableImmutable MemtableSSTable中的Immutable Memtable从结构上讲和Memtable是完全一样的区别仅仅在于其是只读的不允许写入操作Memtable则是允许写入和读取的Memtable写入的数据占用内存到达指定数量则自动转换为ImmutableMemtable等待Dump到磁盘中系统会自动生成新的Memtable供写操作写入新数据理解了Memtable那么Immutable Memtable自然不在话下

        LevelDbMemTable提供了将KV数据写入删除以及读取KV记录的操作接口但是事实上Memtable并不存在真正的删除操作,删除某个KeyValueMemtable内是作为插入一条记录实施的但是会打上一个Key的删除标记真正的删除操作是Lazy会在以后的Compaction过程中去掉这个KV

        需要注意的是LevelDbMemtableKV对是根据Key大小有序存储的在系统插入新的KVLevelDb要把这个KV插到合适的位置上以保持这种Key有序性其实LevelDbMemtable类只是一个接口类真正的操作是通过背后的SkipList来做的包括插入操作和读取操作等所以Memtable的核心数据结构是一个SkipList

        SkipList是由WilliamPugh发明他在Communicationsof the ACM June 1990, 33(6) 668-676 发表了Skiplists: a probabilistic alternative to balanced trees在该论文中详细解释了SkipList的数据结构和插入删除操作SkipList是平衡树的一种替代数据结构但是和红黑树不相同的是SkipList对于树的平衡的实现是基于一种随机化的算法的这样也就是说SkipList的插入和删除的工作是比较简单的

        关于SkipList的详细介绍可以参考这篇文章http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html讲述的很清楚LevelDbSkipList基本上是一个具体实现并无特殊之处SkipList不仅是维护有序数据的一个简单实现而且相比较平衡树来说在插入数据的时候可以避免频繁的树节点调整操作所以写入效率是很高的LevelDb整体而言是个高写入系统SkipList在其中应该也起到了很重要的作用Redis为了加快插入操作也使用了SkipList来作为内部实现数据结构

备注:本文转载自朗格科技:http://www.samecity.com/blog/Article.asp?ItemID=108

你可能感兴趣的:(LevelDb之五:MemTable详解)