leveldb源码学习
延禾xy
个人学习记录及思考。专注当下,停止焦虑。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
leveldb头文件的接口介绍
参考网址:http://www.aikaiyuan.com/7925.html0、leveldb头文件结构include └── leveldb ├── c.h => c binding ├── cache.h => cache接口 ├── comparator.h => 比较器接口 ├── db.h转载 2016-10-29 20:12:28 · 1206 阅读 · 0 评论 -
LevelDB源码分析9-MemTable
Memtable中存放内存中的key-value,其提供了写入,删除以及读取k-v记录的接口。leveldb在插入时要保证key的顺序性,因此Memtalbe的核心数据结构是一个skip-list,Memtalbe只是一个接口类。Memtalbe为上层调用提供接口。class MemTable { public: // MemTables are reference counted. The原创 2016-11-30 11:14:55 · 557 阅读 · 0 评论 -
LevelDB源码分析10-比较函数
Comparator在leveldb中Comparator为一个抽象类。默认的比较函数为字节比较,class Comparator { public: virtual ~Comparator(); // Three-way comparison. Returns value: // < 0 iff "a" < "b", // == 0 iff "a" == "b", /原创 2016-11-30 11:06:59 · 1139 阅读 · 0 评论 -
LevelDB源码分析8-db key
为了更好的阅读Memtable,先看一看Memtable的key.ValueTypelevledb更新时不会操控db中的数据,每次操作都是直接插入一份kv数据,具体的数据合并和清除工作由后台的compact完成。所以,每次 put,db 中就会新加入一份 KV 数据,即使该 key 已经存在;而 delete 等同于 put 空的 value。为了区分真实 kv 数据和删除操作的 mock 数据,使原创 2016-11-30 10:45:41 · 858 阅读 · 0 评论 -
LevelDB源码分析7-随机数产生
随机数产生的原理在C语言中,随机数是通过“线性同余法”产生的。seed = (seed*A + C) % M通常A,C,M一般取质数。 如果定义了随机数函数如下:void rand(int &seed){ seed = (seed*A+C)%M;}每次调用rand函数都会产生一个随机数给seed,实际上这是一个伪随机数,每当取相同的seed时,得到的序列相同。seed被称为种子,M应该原创 2016-11-17 16:42:00 · 556 阅读 · 1 评论 -
LevelDB源码分析6-skip_list
leveldb在内存中的数据为memtable(也有immuable memtable,只读),在底层用skiplist来实现。skiplist平均查找时间为O(logN),最坏为O(N),实现简单,常数项小。lerveldb采用内存屏障来实现同步,支持多线程操作。内存屏障[1]内存屏障用于进程组的同步,在应用中划分了若干个阶段,并且规定只有所有的进程都就需准备到下一个阶段,进程才可以进入下一个阶段原创 2016-11-17 16:40:40 · 583 阅读 · 0 评论 -
LevelDB源码分析5-Arena.md
Arena为leveldb的内存管理单元,避免频繁的new/delete,减少内存申请和释放带来的开销。整体类class Arena { public: Arena(); ~Arena(); // Return a pointer to a newly allocated memory block of "bytes" bytes. char* Allocate(size_t byt原创 2016-11-16 16:45:06 · 365 阅读 · 0 评论 -
LevelDB源码分析4-Status
所在文件:status.cc和status.hleveldb用一个Status类来表示函数执行的状态,用一个enum类型来表示。当没有错误时,state_为NULL,否则,会有错误码。 Status有一个cosnt char* state_,为了节省内存,分为3个部分使用,意义如下:state_[0..3]为消息的长度state_[4]为消息的类型state_[5..]为错误的消息 co原创 2016-11-16 16:23:06 · 440 阅读 · 0 评论 -
LevelDB源码分析3-Slice.md
leveldb有自己自带的字符串string,而不是用C++原生的string.在leveldb中,是用Slice类来实现的。看看这个类的成员:有两个,data_和size_. private: const char* data_; //数据:是一个const char* size_t size_; //字符串的长度一些构造函数,可以用字符串和strin原创 2016-11-16 16:18:12 · 328 阅读 · 0 评论 -
LevelDB源码分析1-基础
1、一些约定1.1 字节序Leveldb对于数字的存储是little-endian,把int32或者int64转换为char*的函数中,是按照先低位,后高位的顺序存放,也就是litte-endian。1.2 VarInt把一个int32或者int64格式化到字符串中,除了上面说的little-endian字节序外,大部分还是变长存储的,也就是VarInt。对于VarInt,每byte的有效存储是7b原创 2016-11-16 15:52:30 · 420 阅读 · 0 评论 -
LevelDB整体介绍
参考:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html1. leveldb简单介绍说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanjay Ghemawat。这两位是Google公司重量级的工程师,为数甚少的Google Fello转载 2016-10-29 21:25:23 · 3695 阅读 · 0 评论 -
LevelDB源码分析2-整数编解码
文件coding.cc和coding.h。leveldb有自己的编解码系统。变长整数编码每一个Byte最高位bit用0/1表示该整数是否结束,用剩余7bit表示实际的数值。这四个函数是把value插入到dst最后面extern void PutFixed32(std::string* dst, uint32_t value);extern void PutFixed64(std::string*原创 2016-11-16 16:15:20 · 548 阅读 · 0 评论
分享