
leveldb
空腹熊猫
普通后台开发,喜欢看源码,对机器学习深度学习感兴趣
展开
-
leveldb源码学习之LRU Cache
Leveldb内部通过双向链表实现了一个标准版的LRUCacheinclude/leveldb/cache.h// Cache 是将key映射为value的接口. 有内部同步机制可供多线程并发安全访问// 可以自动淘汰元素以为新元素腾出空间. Values 在缓存中有一定的费用. 例如一个value是变长string的cache,可以使用string的长度作为其费用.// 内置的...原创 2020-04-04 15:42:21 · 434 阅读 · 0 评论 -
leveldb源码学习之基本数据结构Status
Leveldb 中的返回,将错误码和错误信息封装成Status类,统一进行处理。并定义了几种具体的返回状态。为了节省空间Status并没有用std::string来存储错误信息,而是将返回码(code),错误信息message及长度打包存储于一个字符串数组中。成功状态OK是NULL state_,否则state_是一个包含如下信息的数组:state_[0..3]==消息m...原创 2020-04-04 10:05:42 · 574 阅读 · 0 评论 -
leveldb源码学习之基本数据结构Slice
slice用于表示字符串,包括length和一个指向外部字节数组的指针。和string一样,允许字符串中包含’\0’。提供一些基本接口,可以把const char*和string转换为Slice;把Slice转换为string,取得数据指针const char*。include/leveldb/slice.h// Slice 是一个简单的结构,包含一个指向外部存储的指针,和一个siz...原创 2020-04-04 10:02:45 · 559 阅读 · 0 评论 -
leveldb源码学习之 DBImpl 类(后台压缩 major compaction)
推荐结合leveldb-handbook来看源码compaction分为两类:minor compaction major compactionminor compaction是将一个内存数据库中的所有数据持久化到一个磁盘文件中有三个条件会触发major compaction:当0层文件数超过预定的上限(默认为4个); 当level i层文件的总大小超过(10 ^ i) M...原创 2020-04-04 09:32:00 · 340 阅读 · 0 评论 -
leveldb源码学习之日志 log 读取
推荐结合leveldb-handbook来阅读源码接上篇leveldb源码学习之日志 log 写入原创 2020-04-03 12:31:48 · 532 阅读 · 0 评论 -
leveldb源码学习之 DBImpl 类(数据写入)
推荐结合leveldb-handbook 阅读源码leveldb以其优秀的写性能著名整体流程leveldb的一次写入分为两部分:将写操作写入日志; 将写操作应用到内存数据库中;写类型leveldb对外提供的写入接口有:(1)Put(2)Delete两种。这两种本质对应同一种操作,Delete操作同样会被转换成一个value为空的Put操作。除此以外,leveldb还...原创 2020-04-02 21:17:32 · 612 阅读 · 0 评论 -
leveldb源码学习之 DBImpl 类(恢复日志到memtable:Recover)
推荐结合 leveldb-handbook阅读源码数据库每次启动时,都会有一个recover的过程,简要地来说,就是利用Manifest信息重新构建一个最新的version。过程如下:利用Current文件读取最近使用的manifest文件; 创建一个空的version,并利用manifest文件中的session record依次作apply操作,还原出一个最新的versio...原创 2020-04-03 17:50:22 · 359 阅读 · 0 评论 -
leveldb源码学习之 DBImpl 类(压缩 compaction)
推荐结合leveldb-handbook 来看源码Compaction是leveldb最为复杂的过程之一,同样也是leveldb的性能瓶颈之一。其本质是一种内部数据重合整合的机制,同样也是一种平衡读写速率的有效手段compaction分为两类:minor compaction major compactionminor compaction是将一个内存数据库中的所有数据持久化到...原创 2020-04-01 12:34:36 · 501 阅读 · 0 评论 -
leveldb源码学习之日志 log 写入
用于将数据写入内存中的block 若数据长度超出当前block大小,需要分片 数据的header固定占用7个字节 log_writer.h#ifndef STORAGE_LEVELDB_DB_LOG_WRITER_H_#define STORAGE_LEVELDB_DB_LOG_WRITER_H_#include <stdint.h>#inc...原创 2020-03-31 11:55:57 · 354 阅读 · 0 评论 -
leveldb源码学习之MemTable
levedb的MemTable用于存储k-v数据memtable 用引用计数器管理,若计数为0则释放空间 用跳表实现内部有序 memtable 的key编码为以长度作为前缀的string,所以要先读取到实际长度,再获取key内容。 key末尾存放64位的tag,标识key是value还是delete。查询时找到的key为value则返回值,为delete则返回notfoundmemta...原创 2020-03-30 21:24:04 · 278 阅读 · 0 评论 -
LevelDB 学习:官方文档介绍
翻译自《leveldb》LevelDB是一个快速的k-v存储库,由Google开发,提供有序的字符串键值对映射.特性Keys 和 values 可以使任意字节数组 数据按key排好序存储. 调用方可以提供比较函数来覆盖key的排序方式 基本操作有:Put(key,value),Get(key),Delete(key). 多个修改操作可以作为一个原子操作 用户可创建瞬时快...原创 2020-03-24 18:06:49 · 598 阅读 · 0 评论 -
leveldb源码学习之内存池Arena
Arena:Leveldb的简单的内存池,它所作的工作十分简单,申请内存时,将申请到的内存块放入std::vector blocks_中,在Arena的生命周期结束后,统一释放掉所有申请到的内存,内部结构如图所示。Arena主要提供了两个申请函数:其中一个直接分配内存,另一个可以申请对齐的内存空间。Arena没有直接调用delete/free函数,而是由Arena的析构函数统一释放所有的内...原创 2020-04-04 11:01:10 · 127 阅读 · 0 评论 -
leveldb源码学习之跳表skiplist
Skip list(跳跃表)是一种可以代替平衡树的数据结构。Skip lists应用概率保证平衡,平衡树采用严格的旋转(比如平衡二叉树有左旋右旋)来保证平衡,因此Skip list比较容易实现,而且相比平衡树有着较高的运行效率。由于skip list比较简单,实现起来会比较容易,虽然和平衡树有着相同的时间复杂度(O(logn)),但是skip list的常数项相对小很多。skip list在空...原创 2020-03-31 10:21:16 · 199 阅读 · 0 评论 -
leveldb学习:leveldb 安装及使用
leveldb 安装及使用leveldb 简介leveldb 是 Google 用 C++ 开发的一个快速的键值对存储数据库,提供从字符串键到字符串值的有序映射。leveldb 安装下载 leveldbgit clone https://github.com/google/leveldb.git编译 leveldbcd leveldb/make编译的...转载 2019-03-04 19:21:18 · 1023 阅读 · 0 评论 -
leveldb学习:leveldb实现原理
LevelDb日知录之一:LevelDbLevelDb由两位是Google公司重量级的工程师:Jeff Dean和Sanjay Ghemawa 发起。Jeff Dean:Google大规模分布式平台Bigtable和MapReduce主要设计和实现者。Sanjay Ghemawat:Google大规模分布式平台GFS,Bigtable和MapReduce主要设计和实现工程师。这二...转载 2019-03-04 19:33:34 · 1805 阅读 · 0 评论