leveldb

sst table 是leveldb存储数据的主要形式,每一个sst table 是一个文件,其中主要存储了用户数据,即k-v数据。
为了快速找到待查找的key,sst文件中的数据按照key的大小有序排放,而且,还设置了索引,加快查找的效率。


skip list
mmt 在内存中以skip list的形式保存,skiplist提供 iterator,以及put get等功能,其put和get并没有加锁,因为db的操作最终都是由一个线程负责, 多个线程并发使用db时,通过形成一个writer的队列,通过生产者消费者N:1的模式来消费这些操作。

插入队列和写log的顺序是怎样的?


table Builder 

table builder提供将一个具体的k-v数据写入文件的功能,主要是通过BlockBuilder来完成的,blockbuilder完成具体一个k-v的写入,并且包装成为 
<shared_key_size><non_shared_key_size><value_size>形式,并且写入crc等信息
然后返回一个string

writeBatch 和writeBatchInternal 的关系
writeBatchInternal 完成一些内部与业务无关的方法
writeBatch的一些底层方法,交给internal完成,比如返回Count

writeBatch 中攒了一堆用户的输入,目的是完成批量存入数据库,
按照这个目的,这个类中需要有一个字符串,保存所有输入,这个字符串的格式,
sequence+count+k-v
writeBatch有一个内部类,完成一些底层的方法,不想暴露除去的internal类,
writeBatch核心的接口应该是通过internal提供的InsertInto,这个方法将wb中全部k-v,写入mem table
有一个内部类  handler, 通过put delete等方法

writer 封装了一个batch,writes是一个队列,里面是writer,


put 一个 key value时, 先将其放到一个writebatch中,然后写入这个writebatch,写入writebatch的方式是,先构造一个writer,把writerbatch放到writer里面,然后把writer放到writers队列里面,没有看出有什么好处??写入log时, 可以一次性写入更多的数据,减少磁盘io写次数


version version-set  version-edit 

version 是一个文件集合,记录了每个level所有sst文件的信息,而且version是version set的元素,通过链表组织起来,version之所以需要多个组成set,的目的是为了保存sst文件变化的所有状态,否则leveldb中仅仅需要一个version,version什么时候变化,主要是在compact的时候,低层的sst文件合并到高层,生成新文件,删除旧文件,此时就会生成一个新的version,加入到version-set, 而从就version到新version的变化过程,记录在version-edit中。

version-set的官方解释

version-set代表了一个DBimpl,(这应该是leveldb中最大的一个概念),由一个version的集合组成,其中最新的一个version称为current,其他旧版本的version保存起来,是为查询提供一致性,
比如查询过程中发生了compaction,可能导致查询错误,但是如果查询是基于某一个version的,就可以保证查询过程中,不会有文件变化。


leveldb中所有的sst文件都以一个数字作为文件名
leveldb是一个嵌入式db,意思是,单独leveldb不能作为一个服务启动,是一个lib,每次启动,需要指定对应的db名字,然后 leveldb就会打开对应的文件夹,从文件中读取需要的信息,然后提供,put,get的服务。
新建一个数据库后,会建立一个以数据库名为为文件夹名的文件夹,其中有如下文件
CURRENT:包含一个文件名,指示当前的manifest文件,
LOCK:
LOG:每次操作此DB,会形成一个新的LOG文件,里面记录了比如新建,删除db的操作
MANIFEST-xxxxxx: 后缀名会更新,当前更新到哪里了,需要由CURRENT来指定


recover过程即从db文件夹中的各个文件,恢复当前version的过程,通过CURRENT获取当前的manifest文件,manifest文件是record的集合,每一个record是一个version edit,recover时,逐条record读取出来,然后decode成version edit,然后通过builder,将version恢复出来。

comparator 有两个类  InternalKeyComparator 和comparator,分别对应与internal key和user key,  internal key是由userkey 和其他一些内容组装成的
key 也有几种,user key< internal key <lookupKey  < 代表包含关系

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值