初始leveldb

  • 一款key-value的存储引擎,但和Redis不同的是,leveldb会将大部分数据存储到硬盘上。
  • 底层用了 Log-Structured Merge(简称LSMtree)
  • 最大的特点就是写入速度快,主要利用了磁盘的顺序写。而其他的存储引擎利用的是随机写入B-tree.

1.LSMtree

LSM-tree是一个多层结构,但实际上还是分为内存磁盘两部分。内存的 C 0 C0 C0层,保存了所有最近写入的 ( k , v ) (k,v) (k,v),这个内存结构是有序的,并且可以随时原地更新,同时支持随时查询。剩下的 C 1 C1 C1 C k Ck Ck 层都在磁盘上,每一层都是一个在 key 上有序的结构。

1.1 相关操作

1.1.1 写入流程

这里指的是 put(k,v) 操作.首先追加到写前日志(Write Ahead Log,简称WAL,也就是真正写入之前记录的日志)中,接下来加到 C0 层。当 C0 层的数据达到一定大小,就把 C0 层 和 C1 层合并,类似归并排序,这个过程就是Compaction(合并)。合并出来的新的 new-C1 会顺序写磁盘,替换掉原来的 old-C1。当 C1 层达到一定大小,会继续和下层合并。合并之后所有旧文件都可以删掉,留下新的。

写入过程基本只用到了内存结构,Compaction 可以后台异步完成,不阻塞写入。

1.1.2 查询流程

在写入流程中可以看到,最新的数据在 C0 层,最老的数据在 Ck 层,所以查询也是先查 C0 层,如果没有要查的 k,再查 C1,逐层查。

2. LevelDB 架构

这里参照了codedump大神的介绍图。

图中可以看到leveldb的数据存储在内存及磁盘上。红色的箭头表示合并数据的走向。

还区分读写吗?

  • memtable有最大限制 write_buffer_size,默认实现的是skiplist.
  • immutable memtable,当memtable装不下数据的时候,数据就会落到这里,而且这时数据不能再修改了。
  • sstable,全称是Sorted String Table,DB数据持久化文件 。levelDB在磁盘上存储了很多sst文件,文件里所有的key都是有序的,每个文件对应一个层级,每个层级有多个文件。

在上面这个存储层次中,越靠上的数据越新,即同一个键值如果同时存在于memtable和immutable memtable中,则以memtable中的为准。

参考资料

LSMtree基本原理及应用

解释了log部分

levelDB代码阅读笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值