![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leveldb源码剖析
文章平均质量分 90
gswen
这个作者很懒,什么都没留下…
展开
-
leveldb源码剖析--编码
leveldb是一个google出品的单机kv数据库。用C++编写,代码量很小,大概只有1~2万行。代码写的可以用优雅来形容,毫无疑问是我至今看到的最优雅的c++代码。而且由于代码量比较小,可以直接通读整个源码,了解一个完整的kv系统的构建流程。是一个很好的学习材料。这也是我第一次读数据库方面的源码,尝试用博客记录阅读过程。在阅读源码的过程中,感觉自己有了很大的提高。希望再写一遍,把这种提高深刻以下原创 2017-03-19 21:41:11 · 2667 阅读 · 6 评论 -
leveldb源码剖析---迭代器设计
本篇主要介绍leveldb中的迭代器设计。迭代器设计封装了leveldb中的所有遍历操作。一个好的设计思想应该是:每个存在容器的地方,就应该有对应容器的迭代器的设计。leveldb是一个容器,leveldb中的每个level中的所有文件组成一个容器,进行merge时,所以待合并的文件集也是一个容器,当然每个sstable文件本身也是一个容器,等等。因此,为每个容器设计一个迭代器,封装访问容器的细节是原创 2017-05-08 19:44:30 · 3158 阅读 · 0 评论 -
leveldb源码剖析---缓存系统
通过前面的分析可以知道,leveldb为了提高写的性能,牺牲了部分的读性能。最差的情况可能需要遍历各个level中的每个文件。为了缓解读性能,leveldb引入了缓存机制,当然,版本信息中包含各个level的文件元信息在一定程度上也可以提高读性能。leveldb提供的缓存系统的底层数据结构是一个开链哈希class ShardedLRUCache : public Cache : LRUCach原创 2017-04-24 17:01:49 · 962 阅读 · 0 评论 -
leveldb源码剖析---日志系统
前言日志就是记录数据库增删记录的文件。之所以需要记录这些东西,主要是为了防止万一数据库运行期间异常崩溃导致的数据丢失。而之所以会出现数据丢失,原因在于我们在往数据库中写数据时,并不是真的将数据库写入到了磁盘中,而可能只是将数据暂存到内存中而已。如果在数据flush到磁盘之前系统崩溃(数据库bug,操作系统bug,机器故障等等),那缓存在内存中的数据就会丢失,而用户以为这些数据已经成功写入数据库了(这原创 2017-04-05 13:38:14 · 2192 阅读 · 0 评论 -
leveldb源码剖析--数据写入(DBImpl::Write)
前面我们介绍了leveldb中数据的编码 ,数据在内存中的存储形式(MemTable),数据在磁盘中的存储格式(sstable),以及sstable的形成过程等等。本篇博文将从leveldb用户的角度,详细走一遍leveldb用户写入数据的整个流程。接口leveldb对用户提供两个可以写入数据的接口: Status Write(const WriteOptions& options, WriteBa原创 2017-03-27 13:50:57 · 3828 阅读 · 2 评论 -
leveldb源码剖析---filter block
前面我们分析了leveldb中的index block和data block。这里主要是分析filter block。filter block属于一种metadata block,它的构造主要由FilterBlockBuilder完成。filter block的作用就是提供快速判断一个key是否存在于某个datablock中,以加速查找的过滤器。回忆在分析TableBuilder的Add函数时,每原创 2017-03-26 17:33:34 · 2426 阅读 · 0 评论 -
leveldb源码剖析--key-value形式的Block块中的数据存储格式
前言前面我们介绍了sstable的存储格式,在介绍sstable时,我们主要关注的是sstable的空间布局,主要是以block为单位。但是具体block里面是怎么存储数据的,我们并没有做过多的介绍。在前面一篇介绍TableBuilder的文章中,我们知道TableBuilder主要是负责生成sstable文件,而且正如我们之前所说,TableBuilder负责的是宏观的sstable生成,具体到数原创 2017-03-26 13:58:43 · 2122 阅读 · 0 评论 -
leveldb源码剖析--TableBuilder生成磁盘sstable
TableBuilder 将数据写入磁盘生成sstable的工作由TableBuilder类完成。顾名思义,TableBuilder负责中封装了sstable的生成格式,它对用户的接口主要是void Add(const Slice& key, const Slice& value);函数,从函数的形式我们也可以看到,就是将键值对逐次加入到sstable中,而至于sstable中的其他管理块,比如in原创 2017-03-25 21:24:15 · 1969 阅读 · 0 评论 -
leveldb源码剖析--MemTable
前言根据前一篇可以知道,leveldb在磁盘中的存储模型是sstable,sstable总的来说就是存储一个一个的key-value信息序列以及一些管理信息。用户一般是通过leveldb的用户接口Status Put(const WriteOptions&, const Slice& key, const Slice& value);或者Status Write(const WriteOptions原创 2017-03-24 16:00:47 · 1145 阅读 · 0 评论 -
leveldb源码剖析---版本管理
所谓的版本,简单地说,指的是leveldb中各个level层的文件信息。显然,随着compaction的进行和新的memtable写入生成新的sstable,版本会不断变化。版本除了记录各层的文件信息外,还记录各层关于compaction的的信息,比如在对于当前版本,最适合进行compaction的level是哪层,以及这层中最适合compaction的是哪个文件等信息。和版本相关的类主要是以下三个原创 2017-03-29 13:19:26 · 1910 阅读 · 4 评论 -
leveldb源码剖析----compaction
根据恰面的分析,背景线程的主体工作在BackgroundCompaction函数中完成。这个函数主要完成以下两个工作:如果imm_非空,则将imm_写入到磁盘中生成新的sstable文件对level中的文件进行合并。合并的目的主要是避免某个level中sstable文件过多,并且可以通过合并的过程删除掉过期的key-value和被用户删除的key-value。这篇文章主要是从Backgroun原创 2017-03-28 18:11:18 · 2649 阅读 · 1 评论 -
leveldb源码剖析---DBImpl::MakeRoomForWrite函数的实现
前言前面我们说过,leveldb用户通过调用write或者put函数向数据库中写入数据实际上是将数据写入到levedb的Memtable中。我们也曾经提到过,leveldb中有两个MemTable,分别是imm_和mem_,其中imm_是不可写的,因此实际上我们将数据写入到mem_中。leveldb提供持久化,也就是需要将内存中的数据保存到磁盘上,也就是前面说的以sstable的形式将数据持久化。在原创 2017-03-27 16:34:28 · 2546 阅读 · 0 评论 -
leveldb源码剖析-sstable
leveldb中存储数据的文件格式称为sstable。它的存储格式如下图所示 从sstable的格式可以看出,在一个sstable文件中,除了包含核心的key-value数据的data block区域外,还有其他几个数据区。这些额外的数据区域主要是用于组织data block,使得在读的时候可以快速地从sstable中找到所查找的key对应的value。下面我们来分析一下sstable中的各原创 2017-03-20 15:03:24 · 1326 阅读 · 1 评论 -
Nginx源码剖析--HTTP模块配置结构体在conf_ctx中的组织
前言http模块配置结构体组织架构问题解决方案总结前言上一篇文章介绍了event模块的配置结构体的初始化以及模块中的一些初始化函数,比如init_process函数。这些工作都是在服务器启动之前必须完成的。 在介绍event模块的配置结构体初始化时,我们知道event模块的解析是从events{}“events”关键字开始的。也就是说与event模块相关的所有配置项都必须在配置文件的ev原创 2017-10-21 15:00:40 · 1195 阅读 · 2 评论