leveldb
文章平均质量分 78
禾夕
这个作者很懒,什么都没留下…
展开
-
leveldb之log写操作
当应用要插入一条记录时,leveldb首先是将其写入到log中,若成功,则继续将其插入到memtable中。因此,当系统故障而memtable又没有来得及将数据存放到内存中,那么就可以通过log文件来恢复数据,保证数据不会丢失。 由于log的读比较复杂,因此将主要介绍log的写操作。在class DBImpl中主要有两个与log相关的成员变量:log::Writer* log_; 和原创 2015-04-27 16:00:27 · 2278 阅读 · 1 评论 -
leveldb之Put、Get操作
一个简单的leveldb使用示例如下:#include <assert.h>#include <iostream>#include "leveldb/db.h"#include "leveldb/env.h"using namespace std;#include <assert.h>#include <iostream>#include "leveldb/db.h"#include原创 2015-04-27 10:37:31 · 4106 阅读 · 0 评论 -
leveldb之Compaction操作下之具体实现
由上文可知,合并主要分为三种:1)对Memtable进行合并2)trivial Compaction,直接将文件移动到下一层3)一般的合并,调用DoCompactionWork()实现下面将具体介绍其实现。1、Memtable的合并对Memtable的合并,调用DBImpl::CompactMemTable()完成void DBImpl::Compa原创 2015-05-17 19:40:32 · 4773 阅读 · 0 评论 -
leveldb之Version相关数据结构
在leveldb中,Version就代表了一个版本,它包括当前磁盘及内存中的所有文件信息。当执行一次compaction后,Leveldb将在当前版本基础上创建一个新版本,在所有的version中,只有一个是CURRENT。VersionSet是所有Version的集合,用于管理所有的version。VersionEdit记录了Version之间的变化,其中记录了基于上一Version增加原创 2015-05-15 10:09:24 · 3596 阅读 · 1 评论 -
leveldb之DBImpl
1、leveldb::DB的成员函数基类leveldb::DB,提供面向用户的接口,用户主要使用其提供的接口来操作数据库,最重要的操作为增、删、查找。class DB { public: static Status Open(const Options& options,const std::string& name,DB** dbptr);//打开一个名为name的数据库,并存放在原创 2015-05-18 21:11:04 · 1596 阅读 · 0 评论 -
leveldb之WriteBatch
1、leveldb的写数据在leveldb中,我们通过调用db->Put(WriteOptions(),&key,&value);来写入数据,而WriteOptions只有一个变量sync,且默认初始值为false,因此leveldb默认的写数据方式是异步,即每将写操作提交将数据写入到内存中就返回,而将数据从内存写到磁盘的方式是异步的。异步写比同步写的效率高得多,但是当系统故障时,可能导致最近的更新原创 2015-04-28 20:49:08 · 5921 阅读 · 1 评论 -
leveldb之文件
1、leveldb的文件命名当运行一次leveldb来写入数据时,leveldb可能会生成很多个log文件和SSTable文件,而这些文件的命名都是类似的,都是固定前缀+文件编号+固定后缀的。这些文件的名称是调用函数MakeFileName()来生成的。static std::string MakeFileName(const std::string& name, uint64_t原创 2015-05-15 16:38:42 · 4888 阅读 · 1 评论 -
leveldb之SSTable的创建与访问
在上篇 leveldb之SSTable 中,已经分析了SSTable的结构布局,并详细分析了数据区DataBlock的生成和使用,本文将详细分析一个完整的sstable的生成。SSTable主要分为五部分:1)DataBlock:存储Key-Value记录2)MetaBlock:暂时没有使用3)MetaBlock_index:记录filter的相关信息(本文暂时没有考虑filter原创 2015-05-11 16:18:58 · 2275 阅读 · 0 评论 -
leveldb之cache
当向leveldb写入数据时,首先是将数据写入leveldb的Memtable(Memtable可能转化为IMMemtable)中,Memtable是存储在内存中的。只有经过compaction操作后,才会将内存中的数据写入到磁盘中的sstable中。 当要读数据时,首先在Memtable中查找,若没有找到,则在sstable中继续查找。而sstable是存储在磁盘中的,这样就需要进行多次磁盘操作原创 2015-05-04 21:12:10 · 3816 阅读 · 2 评论 -
leveldb之Arena
leveldb通过Arena类来进行内存的申请和管理。Arena类只是一个内存管理器,只负责申请内存和管理内存,不能进行内存的二次分配,因此不能将其看做是一个内存池。class Arena { public: Arena(); ~Arena();//生命周期结束后,统一释放所有block char* Allocate(size_t bytes); char* AllocateAlig原创 2015-04-28 10:41:27 · 706 阅读 · 0 评论 -
leveldb之SSTable
转载:http://blog.csdn.net/tankles/article/details/7663905 SSTable是Bigtable中至关重要的一块,对于LevelDB来说也是如此,对LevelDB的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节。 1、SSTable的布局本节主要介绍SSTable某个文件的物理布局和逻辑布局结构,这对了解L转载 2015-05-10 16:30:43 · 1276 阅读 · 0 评论 -
leveldb之SkipList的简单实现
1、SkiplistSkipList是链表的变形,它在链表的基础上给每个元素增加了一个高度,且每个元素的高度是一个随机值,因此SkipList是一种随机化的数据结构。SkipList增、删查、改的效率都非常高,是一种典型的以空间换时间的存储方式。常规的链表如下: 而相同元素对应的SkipList结构如下: 由上可知,当要在链表中查找某个元素时,必须从链表头一个一个遍历,而在SkipList中查找原创 2015-04-30 11:27:05 · 975 阅读 · 0 评论 -
LevelDb之Compaction
前文有述,对于LevelDb来说,写入记录操作很简单,删除记录仅仅写入一个删除标记就算完事了,但是读取记录比较复杂,需要在内存以及各个层级文件中依照新鲜程度依次查找,代价很高。为了加快读取速度,levelDb采取了compaction的方式来对已有的记录进行整理压缩,通过这种方式,来删除掉一些不再有效的KV数据,减小数据规模,减少文件数量等。 levelDb的compaction机转载 2015-04-27 16:39:26 · 1784 阅读 · 0 评论 -
leveldb之示意图
部分图片来源:http://blog.csdn.net/houzengjiang/article/details/7718548 http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html http://blog.csdn.net/sparkliang/article/details/8635821Arena:内存管理,每次根据需求转载 2015-05-12 14:59:46 · 1014 阅读 · 0 评论