
levelDB
巴山独钓
tankles: thank you and thanks 中文译:感恩
展开
-
levelDB源码分析-提纲
好久没有动静了,工作、加班、独自学习源码、整理资料 ... 接下来将发表一系列levelDB源码学习过程中记录下的东西,现已部分整理完毕,其中很多描述直接参照网上已经发布的关于levelDB实现原理及源码分析等相关资料,随后附上链接,并结合自己研读,附上代码注释,主要包括: 《levelDB源码分析-Slice》原创 2012-06-14 15:26:39 · 5193 阅读 · 1 评论 -
levelDB源码分析-Arena
Arena在leveldb中它是一个内存池,它所作的工作十分简单,申请内存时,将申请到的内存块放入std::vector blocks_中,在Arena的生命周期结束后,统一释放掉所有申请到的内存,内部结构如下图所示。 Arena定义为: class Arena { public: Arena();原创 2012-06-14 16:08:29 · 3643 阅读 · 0 评论 -
levelDB源码分析-Status
leveldb::Status表示levelDB的一个返回状态,通常的错误处理(如:errno)是返回一个错误号,然后根据错误号可以获得出错的描述信息。 leveldb将错误号和错误信息封装成Status类,来统一进行处理。 声明如下: class Status { public: // Create a原创 2012-06-14 15:54:08 · 3385 阅读 · 0 评论 -
levelDB源码分析-TableCache
Table相当于.sst文件在内存中的映像,它保存了.sst文件的Index Block数据。 TableCache相当于所有打开的.sst文件在内存中的管理结构,内部采用LRUCache,每个打开的.sst文件在LRUCache中都有一项:map {file, table}> static void DeleteEntry(const Slice& key原创 2012-06-14 17:37:44 · 2305 阅读 · 1 评论 -
levelDB源码分析-SSTable:.sst文件构建与读取
.sst文件的构建是通过TableBuilder进行的,读取主要集中在TableBuilder操作(table_builder.cc)如下: struct TableBuilder::Rep { // TableBuilder内部使用的结构,记录当前的一些状态等 Options options; Options index_block_o原创 2012-06-14 17:35:47 · 5643 阅读 · 3 评论 -
levelDB源码分析-SSTable:Block
levelDB中涉及Block操作的接口机函数基本如下: class Block; // Block数据结构定义,主要通过Block::Iter操作 class Block::Iter : public Iterator ; // Block中每个entry的迭代器,内部使用DecodeEntry解析每个entry static原创 2012-06-14 17:32:55 · 4170 阅读 · 1 评论 -
levelDB源码分析-Log文件
levelDB中log文件在LevelDb中的主要作用是系统故障恢复时,能够保证不会丢失数据。因为在将记录写入内存的Memtable之前,会先写入Log文件,这样即使系统发生故障,Memtable中的数据没有来得及Dump到磁盘的SSTable文件,LevelDB也可以根据log文件恢复内存的Memtable数据结构内容,不会造成系统丢失数据,在这点上LevelDb和Bigtable是一致的。原创 2012-06-14 17:22:40 · 5323 阅读 · 2 评论 -
levelDB源码分析-Memtable
本节讲述内存中LevelDB的数据结构Memtable,Memtable在整个体系中的重要地位也不言而喻。总体而言,所有KV数据都是存储在Memtable,Immutable Memtable和SSTable中的,Immutable Memtable从结构上讲和Memtable是完全一样的,区别仅仅在于其是只读的,不允许写入操作,而Memtable则是允许写入和读取的。当Memtable写入的数据原创 2012-06-14 16:36:42 · 2844 阅读 · 0 评论 -
levelDB源码分析-Skiplist
这里主要介绍levelDB中关于SkipList的实现,关于SkipList介绍请求参阅《SkipList》,这里不再引用了。 在levelDB中的使用: levelDB中Memtable有一个核心的数据结构Skiplist,具体实现的代码稍有不同,但是基本原理是一致的。 levelDB中Skiplist定义为模板类:原创 2012-06-14 16:19:15 · 6275 阅读 · 3 评论 -
levelDB源码分析-Slice
levelDB中Slice非常简单的数据结构,它包括length和一个指向外部字节数组的指针。为什么使用Slice,而不直接使用std::string呢? 1、相比返回string,返回Slice的开销会小的多(没有拷贝,Slice中没有实际数据,只有指向数据的指针,开销低)。 2、leveldb允许key和value包含'\0',不能返回以null结尾的原创 2012-06-14 15:44:16 · 5737 阅读 · 0 评论 -
levelDB源码分析-Cache(LRUCache、HashTable)
leveldb内部通过双向链表实现了一个LRUCache,利用双向链表实现LRUCache的算法在《操作系统》中描述的很清楚,这里和标准的LRUCache一样,这里不再描述。 LRUCache内部实现了一个Hashtable,用于快速查找key对应的双向链表节点。 Class Cache采用虚函数定义了Cache的接口,具体实现的LRUCache继承Ca原创 2012-06-14 16:31:59 · 5339 阅读 · 1 评论