leveldb代码精读 插入操作
leveldb插入数据时,必然做的操作是先写logfile,再将数据放到cache里不过在此之前,会先进行一下预处理1 将要写的数据封装到到writer里,将write加入写队列,等待轮到它写。2 检查cache是否已满,是否需要“做检查点”3 leveldb的cache有两个状态,当前状态和只读状态。当cache写满,需要写文件时,会将cache转成只读...
leveldb代码精读 数据库启动和初始化
基本概念数据库主要包括cache、日志文件、数据文件、CURRENT文件和manifest文件几大块。所有文件都是依照类型+文件号的命名规则,文件号非常重要,类似oracle的sequence#。其中cache是当前写入的数据缓存,写入数据时1 将数据写入日志文件2 将数据放入cache当达到一定条件,如cache里的数据够多时1 将cache转成...
leveldb代码精读 lru cache
LRUCache的最基本的单位是struct LRUHandle,用来存放数据和一系列指针。LRUCache里有一个LRUHandle组成的LRU链表和一个LRUHandle组成的HandleTable对象存放数据。
leveldb代码精读 skiplist
skiplist是在链表的基础上,在节点内添加若干个指向后面第n个节点的指针,使得链表实现类似树状的结构。它和普通链表的显著区别1 skiplist的节点由于记录了后面第n个节点的地址,也就是有了分支,也和树一样有高度的概念,2 skiplist是排序链表,而每个节点的数据类型是模板实现的,也就是可以是任意类型。因此为了排序,用户需要指定一个Comparator类的实现,告诉skiplist如何比较两个节点数据的大小。3 正是因为skiplist是排序的,因此在skiplist里查找数据的效率特别高,节点记录了下一个和下面第n个节点的地址,可以实现类似二分法查找的效率。
leveldb代码精读 内存池Arena
level db有个内存池不叫xxxpool,而叫Arena。从操作系统申请内存的方式是直接new一个空的char数组,得到一大块连续内存作为数据块,并维护数据块内的空间使用情况。当有app申请内存时,将数组里某个char的地址返回给app,让它使用从这个char开始的一段连续内存。当一个数据块不能满足app的连续内存需求时,就会创建新的char数组。每个char数组,也就是数据块的地址都记录在Arena的一个vector里。当Arena销毁时,就根据vector里记录的数据块地址逐个释放空间。