
leveldb
草上爬
专注技术,热爱分享
展开
-
LevelDB源码分析之十六:.log文件
LevelDB中log文件在LevelDB中的主要作用是系统故障恢复时,能够保证不会丢失数据。因为在将记录写入内存的Memtable之前,会先写入Log文件,这样即使系统发生故障,Memtable中的数据没有来得及Dump到磁盘的SSTable文件,LevelDB也可以根据log文件恢复内存的Memtable数据结构内容,不会造成系统丢失数据。 下面我们带大家看看log文件的具原创 2018-01-18 17:58:26 · 1700 阅读 · 0 评论 -
LevelDB源码分析之十五:table cache
阅读本博客可参考:LevelDB源码分析之十一:cacheLevelDB源码分析之十二:blockLevelDB源码分析之十三:table由上面这三篇博客可知,LevelDB的Cache分为两种,分别是table cache和block cache。block是table文件内组织数据的单位,也是从持久化存储中读取和写入的单位。block cache是缓存的bloc原创 2018-01-15 13:04:06 · 2459 阅读 · 0 评论 -
LevelDB源码分析之十四:TwoLevelIterator
一.原理先看一个例子,我们为书店写一个管理图书的程序,书店里有许多书Book,每个书架(BookShelf)上有多本书。类结构如下所示:class Book {private: string book_name_;};class Shelf { private: vector books_;};如何遍历书架上所有的书呢?一种实现方法是:vector& Get原创 2018-01-12 18:08:23 · 1773 阅读 · 0 评论 -
LevelDB源码分析之十三:table
一.Table的逻辑结构Table也叫SSTable(Sorted String Table),是数据在.sst文件中的存储形式。Table的逻辑结构如下所示,包括存储数据的Block,存储索引信息的Block,存储Filter的Block:Footer:为于Table尾部,记录指向Metaindex Block的Handle和指向Index Block的Handle。需要说明的是原创 2018-01-10 17:59:06 · 3038 阅读 · 0 评论 -
LevelDB源码分析之十二:block
一.Block的存储格式Block的种类很多,包括Data Block、Meta Block等,每个Block由三部分组成,如下图所示:1.block datablock data是具体的KV对存储区域。虽然Block有好几种,但是block data都是有序的KV对,因此写入、读取block data的接口都是统一的。2.typetype指明使用的是哪种压缩方式,当前原创 2018-01-05 12:29:36 · 3363 阅读 · 2 评论 -
LevelDB源码分析之十一:cache
Cache为接口类。ShardedLRUCache继承自Cache,实现了Cache中的缓存操作方法。ShardedLRUCache封装了16个LRUCache缓存片,每次对缓存的读取、插入、查找、删除操作都是调用某个缓存片LRUCache中的相应方法完成。LRUCache为一个循环双向链表,与标准实现一致。其“头结点”lru_的prev始终指向最新结点,next始终指向最久未用节点,其对原创 2018-01-03 18:20:02 · 1810 阅读 · 0 评论 -
LevelDB源码分析之十:LOG文件
首先要区分LOG文件和.log文件。LOG文件:用来记录数据库打印的运行日志信息,方便bug的查找。.log文件:在LevelDB中的主要作用是系统故障恢复时,能够保证不会丢失数据。因为在将记录写入内存的Memtable之前,会先写入.log文件,这样即使系统发生故障,Memtable中的数据没有来得及Dump到磁盘的SSTable文件,LevelDB也可以根据.log文件恢复内存的Mem原创 2017-12-28 19:55:31 · 1546 阅读 · 0 评论 -
LevelDB源码分析之九:env
考虑到移植以及灵活性,LevelDB将系统相关的处理(文件/进程/时间)抽象成Evn,用户可以自己实现相应的接口,作为option的一部分传入,默认使用自带的实现。 env.h中声明了:虚基类env,在env_posix.cc中,派生类PosixEnv继承自env类,是LevelDB的默认实现。虚基类WritableFile、SequentialFile、RandomAccessFil原创 2017-12-27 16:31:29 · 2622 阅读 · 0 评论 -
LevelDB源码分析之八:memtable
阅读本文可参考:LevelDB源码分析之一:codingLevelDB源码分析之二:comparatorLevelDB源码分析之三:arenaLevelDB源码分析之四:AtomicPointerLevelDb源码分析之五:skiplist(1)LevelDb源码分析之六:skiplist(2)LevelDB源码分析之七:Random原创 2017-12-26 14:18:11 · 1595 阅读 · 0 评论 -
LevelDB源码分析之七:Random
一.原理:C语言中伪随机数生成算法实际上是采用了"线性同余法"。具体的计算如下: seed = (seed * A + C ) % M其中A,C,M都是常数(一般会取质数)。当C=0时,叫做乘同余法。假设我们定义随机数函数:void rand(int &seed){ seed = (seed * A + C ) % M;}每次调用rand函数都会产生一个随机值赋值给原创 2017-12-25 14:45:29 · 1376 阅读 · 0 评论 -
LevelDB源码分析之六:skiplist(2)
阅读本文可参考:LevelDB源码分析之一:codingLevelDB源码分析之二:comparatorLevelDB源码分析之三:arenaLevelDB源码分析之四:AtomicPointerLevelDb源码分析之五:skiplist(1)LevelDB源码分析之七:RandomLevelDB中的skiplist实现方式基本上和中的实现方式类似。它向外暴露接口原创 2017-12-22 16:31:23 · 1342 阅读 · 0 评论 -
LevelDB源码分析之五:skiplist(1)
一.skiplist简介跳表是由William Pugh发明。他在 Communications of the ACM June 1990, 33(6) 668-676 发表了Skip lists: a probabilistic alternative to balanced trees,在该论文中详细解释了跳表的数据结构和插入删除操作。跳跃表使用概率均衡技术而不是使用强制性均衡,因此,对于原创 2017-12-21 12:15:34 · 1954 阅读 · 0 评论 -
LevelDB源码分析之四:AtomicPointer
AtomicPointer 是 leveldb 提供的一个原子指针操作类,使用了基于原子操作(atomic operation)或者内存屏障(memory barrier)的同步访问机制,这比用锁和信号量的效率要高。一.Windows版本的AtomicPointer实现先上源码,这个是Windows版本的源码,源文件位置:leveldb/port/port_win.h和leveldb/原创 2017-12-20 13:43:58 · 2391 阅读 · 0 评论 -
LevelDB源码分析之三:arena
一.原理 arena是LevelDB内部实现的内存池。 们都知道,对于一个高性能的服务器端程序来说,内存的使用非常重要。C++提供了new/delete来管理内存的申请和释放,但是对于小对象来说,直接使用new/delete代价比较大,要付出额外的空间和时间,性价比不高。另外,我们也要避免多次的申请和释放引起的内存碎片。一旦碎片到达一定程度,即使剩余内存总量够用原创 2017-12-19 15:12:01 · 1269 阅读 · 0 评论 -
LevelDB源码分析之二:comparator
这里的comparator包括抽象类Comparator及其两个实现类:一个是内置的BytewiseComparatorImpl,另一个是InternalKeyComparator。一.ComparatorComparator只是导出了几个接口。class Comparator { public: virtual ~Comparator(); // Three-way c原创 2017-12-18 18:10:33 · 3085 阅读 · 0 评论 -
LevelDB源码分析之一:coding
LevelDB默认使用的是小端字节序存储,低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 编码分为变长的EncodeVarint和固定大小的EncodeFixed两种,每种又分32位和64位。一.EncodeFixedvoid EncodeFixed32(char* buf, uint32_t value) {#if __BYTE_ORDER == __LITTLE_E原创 2017-12-15 18:54:30 · 3420 阅读 · 0 评论