skiplist.h/filter_policy.h/arena.h/coding.h分析

一、skiplist.h(跳表)分析

用户只需要处理写冲突,leveldb跳表保证没有读写冲突。函数功能如下:

  • Insert():
    • FindGreaterOrEqual():保存搜索的路径pre[],找到要插入的节点

 

      • KeyIsAfterNode():返回值bool,key是否大于n的数据
    • RandomHeight():知道最底层l0要插入数据,那么高层的哪一层也插入这个数据呢?这个层数是随机生成的,代表从0到这个数之间的层都要插入

 

  • Contains():在 skiplist 中找到节点,如果存在这个节点,且 key 相同,则返回
  • class Iterator{}
    • Seek()
    • Next():移动到下一个节点
    • Prev():
      • FindLessThan():返回小于key的最新节点

要求不能插入重复数据,关键点在于:每个节点插于时,如何确定新插了节点的层数,以使跳表满足既率均衡进而提供高效的查性能。

跳表实现专门对多线程做了优化,但仍需外部加锁

二、filter_policy.h分析

bloom_filter误判率和:哈希函数个数k、位数组长度m、数据集大小n有关,当k=ln2*(m/n)有最优准确率

函数的作用:Leveld中的过滤策略、查找对应的keys的Value时,如果事先知道了所有的key里都找不到这个query,就不需要进一步读取磁盘了.

使用了策略模式,将策略 单独设计为一个类或接口 ,不同的子类对应不同策略。依次计算n个key的K个哈希结果这里使用了Double hash

 

 

 三、Arena.h分析

作用:

  1. 分配指定大小的字节
  2. 按字节对齐的方式分配

四、coding.h分析

函数功能:这个类是用来类型转换和压缩空间的

  • EncodeFixed64:将dst转为小端存到buf中

把int---->varint:是为了尽可能的节约存储空间,最高位是一个标记位

 

posted @ 2022-03-01 10:02  Z9Y1J5  阅读(28)  评论(0编辑  收藏  举报