存储|leveldb常见问题以及性能优化点

本篇是leveldb最后一篇,这里主要把技术核心点,性能提升点或者面试可能会被问到进行总结。
一、常见问题 1、leveldb key-value内存,内存中保存的是所有key-value吗?
答:不是 搜索顺序,memtable immtable ldb文件
2、布隆过滤器 在leveldb中的应用是什么?
答:布隆过滤器主要应用查找方面,如果查找一个key在过滤器中返回false,那么一定不存在文件中。leveldb默认没有开启布隆过滤器功能。
【存储|leveldb常见问题以及性能优化点】3、有一个比较旧的数据key-value,假设在第6层,现在对其进行删除,然后执行流程是什么?
答:直接创建一条标记为Delete的记录,插入到db即可。在查询的时候,level级别越低数据新鲜程度越高,从低层层次开始查询,如果查到了并且标记是删除,那么就返回给用户记录被删除。后面合并数据时例如:合并level5, level6时才会把数据真正从物理磁盘中删除掉。
4、leveldb SequenceNumber 达到最值之后
答:assert
5、为什么level0中文件不应该太多?
答:因为level0中文件包含的key是可以重叠的,文件太多不方便查询,而level1~level6 文件中key不重复
6、VersionSet中包含多个Version? 每个version都是干嘛的?

对象 作用
VersionSet Version集合,所有的Version都挂在VersionSet对象下面,一个db只有一个VersionSet
Version 一个db可能存在多个Version,Version之间采用链表方式管理,链表最后节点为当前最新Version信息
VersionEdit 该对象用于生成最新的Version。VersionEdit + 当前使用的Version 生成 新的Version存放到链表尾部,只在需要生成新的Version时才会创建
7、leveldb中SkipList为什么没有提供删除接口?
答:leveldb对于删除操作也是插入流程,只不过是将插入数据标记为删除,存到SkipList中. 既然删除操作也是插入流程,那么leveldb是如何判断当前节点是否删除呢? 判断标记
8、当MemTable占用内存达到门限值后,就会将MemTable写入到文件,那么这个 文件一定属于level0吗?
答:不一定,要看MemTable中最小值和最大值与level0中是否有重叠,如果没有重叠则可能将新生成文件放到更高的level中,具体函数实现可参考PickLevelForMemTableOutput
二、leveldb优化点 1、table cache 使用LRU算法,该cache默认存储62条数据,当达到62条时就会把lrucache中数据删除,可以扩大。
2、MemTable默认大小是4M,我们可以扩大。
3、leveldb默认没有开启布隆过滤器,我们可以在创建Options对象的时候指定开启过滤器。
三、其他 MemTable:默认大小为4M,当Memtable占用4M大小时,就将MemTable写入到文件中.
Level0:level0文件数据不应该过多,默认是4个文件,每个文件大小位XXM,
Level1:每个文件大小为10M
Level2:每个文件大小为100M
LevelN:每个文件大小为LevelN-1 * 10 (上一层文件大小乘以10)

leveldb中几个数字:
NextFileNumber -- 控制.logManifest.ldb 文件名字中数字
LastSequence-- 用于设置WriteBatch的Sequence Number.。不是递增而是根据这个批任务中有多个key-value对进行设置的,具体参考函数DBImpl::Write
LogNumber-- 表示当前Version中使用的 .log文件
PrevLogNumber -- 表示当前Version中保存的上一个.log文件#该参数目前版本没有意义,只是为了向前兼容leveldb版本

    推荐阅读