
leveldb
文章平均质量分 75
aFXbEGIN
这个作者很懒,什么都没留下…
展开
-
leveldb学习:sstable(2)
block_builderblock.h和.cc里定义了block的entry存储格式和restart,提供了entry的查找接口以及迭代器。那么如何往写block里写entry呢?leveldb遵循面向对象的设计理念在block_builder类里提供了相关接口。原创 2015-07-22 17:11:28 · 916 阅读 · 0 评论 -
leveldb学习开篇
打算研究生在读期间好好学习下leveldb的源码,期望能够从中感悟一下现代软件的开发流程和设计模式,体验一下google编程规范,不得不承认leveldb源码写得很有美感,最后最重要的当然是希望从中进一步理解C++语言的精髓。下面贴两篇博客,一篇是leveldb的使用说明和编程入门,另一篇是我觉得写得很好的leveldb内部结构剖析,两篇博客作为学习leveldb的开始,很不错,日后会更新自己原创 2015-06-16 22:06:03 · 1664 阅读 · 0 评论 -
leveldb学习:测试代码
leveldb中带有了大量的测试程序,凡是文件命名中带有_test的文件都是测试代码。就我的理解,阅读测试代码非常要,因为作为一个库,leveldb并不带有main函数,这也不利于我们理解leveldb的结构和流程,而测试代码相当程度上弥补了一点。并且,作为一个在校学生,我们在平时的项目中也极少考虑过写测试代码,今天我就抛砖引玉,以我的水平来剖析下leveldb的测试部分。 leveldb的测试代原创 2015-07-16 23:14:01 · 2093 阅读 · 0 评论 -
leveldb学习:sstable(1)
memtable是k-v数据在内存中的存储对象,当内存中的memtable达到一定的大小时,就需要dump到磁盘中,而sstable就是数据在磁盘中的存储对象,今天看看leveldb的table对象。有关部分代码在leveldb源码文件下的table文件夹内。原创 2015-07-20 21:53:47 · 974 阅读 · 0 评论 -
leveldb学习:Version
到此为止,基本上leveldb的主要功能组件都已经分析完了,下面如何把它们组合在一起形成一个高效稳定的数据库,这就是DBimpl类和compact进程的工作。campact进程为了均衡读写的效率,sstable文件分层次(level)管理,db预定义了最大的level值。compact负责将memtable持久化成sstable,以及均衡整个db中各level的sstable。版本控制当执行原创 2015-07-24 16:51:13 · 1799 阅读 · 0 评论 -
leveldb学习:Versionedit和Versionset
VersionEdit:compact过程中会有一系列改变当前Version的操作(FileNumber增加,删除input的sstable,增加输出的sstable),为了缩小version切换的时间点,将这些操作封装成versionedit,compact完成时,将versionedit中的操作一次应用到当前version即可得到最新状态的version。 versionedit的成员变量:原创 2015-08-16 16:19:27 · 2976 阅读 · 0 评论 -
leveldb学习:DBimpl
leveldb将数据库的有关操作都定义在了DB类,它负责整个系统功能组件的连接和调用,是整个系统的脊柱。level::DB是一个接口类,真正的实现在DBimpl类。 作者在文档impl.html中描述了leveldb的实现,其中包括文件组织、compaction和recovery等等。DBimpl的成员变量包括:字符比较器internal_comparator_、配置类options_、bool型原创 2015-08-20 17:30:13 · 1131 阅读 · 0 评论 -
leveldb学习:内存池Arena
和SGI版的STL一样,leveldb内存分配也采用了memory pool的整理方式,减少内存不断分配释放过程中造成的空间零碎化和浪费。leveldb的内存池实现可参见arena.h和arena.cc,有关内存池的测试代码有arena_test.cc。arena内存池是leveldb的关键组件,是很多其他功能模块(class)的成员,在cache、memtable、table组件中均有使用。 先原创 2015-08-21 16:13:05 · 1827 阅读 · 0 评论 -
leveldb学习:skiplist
leveldb中的memtable只是一个封装类,它的底层实现是一个跳表。跳表是一种基于随机数的平衡数据结构,其他的平衡数据结构还有红黑树、AVL树,但跳表的原理比它们简单很多。跳表有点像链表,只不过每个节点是多层结构,通过在每个节点中增加向前的指针提高查找效率。如下图: 在/leveldb/db文件夹下有跳表的实现skiplist.h和跳表的测试程序skiplist_test.cc。temp原创 2015-08-23 23:09:40 · 1403 阅读 · 1 评论 -
leveldb学习:Env
考虑到移植以及灵活性,leveldb将系统相关的处理(文件/进程/时间)抽象成Evn,用户可以自己实现相应的接口,作为option传入,默认使用自带的实现。 解压目录/util/中放有env的声明和实现代码。env.h中声明了:虚基类env,在env_posix.cc中,派生类PosixEnv继承自env类,是leveldb的默认实现。虚基类WritableFile、SequentialFi原创 2015-08-22 16:28:43 · 1963 阅读 · 1 评论 -
leveldb学习:Memtable和Varint
Memtable:Memtable是leveldb数据在内存中的存储形式,写操作的数据都会先写到memtable中,memtable的size有限制最大值(write_buffer_size)。memtable的底层数据结构是skiplist,class memtable完成的只是key-value的打包和调用底层跳表的接口。 首先看看Memtable的成员变量: //实例化跳表模板 typ原创 2015-08-24 19:28:51 · 1522 阅读 · 0 评论 -
leveldb学习:测试代码续
通过上篇博客,我知道了leveldb的测试程序主函数是如何利用宏TEST和容器tests调用测试程序,今天来看看测试程序,也就是写进_Test_name类的_Run( )究竟实现了什么。原创 2015-07-17 21:14:48 · 919 阅读 · 0 评论 -
leveldb学习:Cache
leveldb自己实现了cache缓冲区替代算法,参见代码cache.h和cache.c文件。leveldb中table_cache等都是以class cache作为底层实现。 cache.h中,我们看到cache类是一个抽象类,声明了lookup;insert;release;value;erase等函数,同时声明了一个全局函数extern Cache* NewLRUCache(size_t c原创 2015-08-29 17:19:32 · 1131 阅读 · 0 评论