levelDB源码解析
文章平均质量分 77
对levelDB进行源码级的剖析
道希
这个作者很懒,什么都没留下…
展开
-
Block-levelDB源码解析
类介绍Block主要负责解析sstable文件中的block;数据成员介绍 30 const char* data_; //对应整个block块数据 31 size_t size_; //对应整个block的大小 32 uint32_t restart_offset_; // 相对于data_的,重原创 2014-01-06 06:55:23 · 1278 阅读 · 0 评论 -
BlockBuilder-levelDB源码解析
对象介绍BlockBuilder主要负责构造sstable文件中的block;首先看下block的数据结构:原创 2013-12-29 17:48:21 · 1477 阅读 · 0 评论 -
WriteBatch-levelDB源码解析
【数据成员介绍】rep_:格式如下图所示,【方法成员介绍】原创 2013-12-22 13:26:17 · 2049 阅读 · 0 评论 -
log format-levelDB源码解析
基本概念:逻辑记录:用户输入的key value,进行包装后,可以形成一条记录,我们把它称为逻辑记录;物理记录:一条或多条物理记录组成一个逻辑记录。block:一条逻辑记录,包含了一个或多个block,kBlockSize = 32768;即每个block的大小为32K;当然一个block里面也可以有多个record;关系示意图:一个逻辑记录原创 2013-12-15 14:53:05 · 1336 阅读 · 0 评论 -
log::Reader-levelDB源码解析
要想理解reader,需要理解两个概念,即逻辑记录,物理记录,这个log format有讲【数据成员介绍】blocking_store_:read以block为单位去从磁盘取数据,取完数据就是存在blocking_store_里面,其实就是读取数据的buffer;buffer_:指向blocking_store_的slice对象,方便对blocking_store_的操作;原创 2013-12-15 14:52:08 · 1865 阅读 · 0 评论 -
log::Writer-levelDB源码解析
writer的工作就是将上层拼装好的数据,按照log format的格式,进行二次拼装,然后写进文件里面。【数据成员介绍】block_offset_:当前block的偏移位,通过它就能知道目前数据写到这一块的什么位置了;dest_:增加记录,就是将数据追加到dest_;type_crc_:因为每个record都会有一个header,而header里面就会有che原创 2013-12-15 14:50:57 · 1284 阅读 · 0 评论 -
memtable-levelDB源码解析
当写数据的时候,写完log,再写内存,内存指的就是这里的MemTable,整个MemTable是一个skip list结构;【数据成员介绍】arena_:一个管理内存的对象;comparator_:比较器;refs_:引用次数;table_:skip list表,数据就是存在这里面;【方法成员介绍】void MemTable::原创 2013-12-15 14:49:51 · 1378 阅读 · 0 评论 -
VersionEdit-levelDB源码解析
VersionEdit记录的是版本变化的增量。【数据成员介绍】compact_pointers_:这是一个vector,里面的每项是一个由level,internalkey组成的pair,也就是说里面记录的是,compact到哪一层的,哪个key了;comparator_:比较器的名称;deleted_files_:这是一个set,里面的每一项是一个由level,s原创 2013-12-15 14:44:53 · 1616 阅读 · 0 评论 -
Version-levelDB源码解析
【数据成员介绍】compaction_level_:下一个需要做compact的层级;compaction_score_:比分,如果比分小于1,就代表没有那么紧急去需要做compact;那么比分的规则是什么呢?void VersionSet::Finalize(Version* v) { int best_level = -1; doub原创 2013-12-15 14:44:05 · 1420 阅读 · 0 评论 -
VersionSet-levelDB源码解析
VersionSet的作用是记录各个版本,这些版本的组织形式是一个环形的双向链表。【数据成员介绍】compact_pointer_:记录每层下次做compact的开始的key;string型数组,index-->level, value-->internal key,current_:指向当前版本;dbname_:数据库的名称;descriptor_fi原创 2013-12-15 14:43:11 · 2387 阅读 · 0 评论 -
varint-levelDB源码解析
【什么是变长整型?】大家知道,int整型一般是4个字节,那变长整型所需要的空间在1-5个字节之间,因为长度是不固定的,所以称之为变长整型。其特点就是只要数值小于2^21,那么就会节省空间。【编码原理】如图所示为300,编码后的字节图,只占了2个字节。这是怎么实现的呢?请看下面的详解:300的二进制编码为00000000 00000000 00000001 0原创 2013-12-13 11:54:38 · 1300 阅读 · 0 评论 -
Status-levelDB源码解析
//status封装了操作结果,当出错的时候,可以用来指明一个错误,还有对应的错误信息//多线程下const方法可以在非外部同步的情况下调用,但是非const方法,一定要在外部同步的情况下调用class Status { public: //构造函数,初始为NULL,即为OK状态 Status() : state_(NULL原创 2013-12-13 11:53:15 · 1172 阅读 · 0 评论 -
Slice-levelDB源码解析
//slice是level中很基础的一个类型,是对key , value的封装,里面的数据成员很简单,只有两个,一个是const char* data_,size_t size_,所以它其实是key或value的一个引用,非常节省内存,同时也提供了非常方便的操作接口。class Slice { public: //创建一个空的slice原创 2013-12-13 11:52:20 · 1197 阅读 · 0 评论 -
option-levelDB源码解析
//控制数据库的行为struct Options{ //比较器 //默认:lexicographic byte-wise ordering const Comparator* comparator; //如果为true,当数据库不存在时,就新建 //默认:false bool creat原创 2013-12-13 11:51:20 · 1346 阅读 · 0 评论 -
undefined reference to `snappy::MaxCompressedLength(unsigned long)'
../pkg/leveldb-1.13.0/libleveldb.a(table_builder.o): In function `leveldb::TableBuilder::WriteBlock(leveldb::BlockBuilder*, leveldb::BlockHandle*)':table_builder.cc:(.text+0x40e): undefined refere原创 2013-12-13 11:48:10 · 5125 阅读 · 0 评论