当前位置: 首页 > article >正文

Level DB --- filter_block

filter_block里面包含FilterBlockBuilder和FilterBlockReader,他们是Level DB中读、写Filter(Level DB --- BloomFilterPolicy-CSDN博客)重要的类,相当于是FIlter的一个Wrapper,将Filter有组织地写(序列化)和读(反序列化)。

FilterBlockBuilder

AddKey

当需要计算filter的时候,不会上来就调用FIlter(Level DB --- BloomFilterPolicy-CSDN博客),而是首先进行预存,如图1所示,其中keys_是FilterBlockBuilder中的数据成员,它是一个string,用来缓存新加入的key value,start_也是FilterBlockBuilder中的数据成员,它是一个vector,用来记录新加入key在keys_中的index。                                                

                                                                            图1. add key

StartBlock

随着key的不断加入,会存在一个阈值,达到这个阈值,就将keys_中的这些记录计算一波filter。计算的阈值源码计算如下:

void FilterBlockBuilder::StartBlock(uint64_t block_offset) {
  uint64_t filter_index = (block_offset / kFilterBase);
  assert(filter_index >= filter_offsets_.size());
  //可以理解每kFilterBase个key存储到一个单元里面
  while (filter_index > filter_offsets_.size()) {
    GenerateFilter();
  }
}

GenerateFilter

当keys_里面存储的数量达到kFIlterBasey以上或是finish的时候,会触发一次hash array的计算和hash array的记录。如图2所示,hash array 是Filter(Level DB --- BloomFilterPolicy-CSDN博客)计算的。filter_offset_记录每次hash array的offset,result_是一个string,每次计算好的hash array会附加在result中。

                                                                     图2. add hash array record 

Finish

当完成了整体的key的filter的计算,会进行序列化,序列化的格式如图3所示。这里面第3项记录的是hash arrays数据在result_中的offset。

                                                                     图3. 序列化 result_

这里有一行代码,这里面阴性将static const size_t kFilterBaseLg = 11,转化为一个char。

result_.push_back(kFilterBaseLg);  // Save encoding parameter in result

FilterBlockReader

FilterBlockReader的构造函数主要是从contents中解析出来FilterBlockBuilder中序列化的数据,而KeyMayMatch计算offset所在的hash array其实就是上述介绍序列化的逆过程。


http://www.kler.cn/a/500505.html

相关文章:

  • 基于STM32的智能家居蓝牙系统(论文+源码)
  • RabbitMQ高级篇
  • 【Ubuntu与Linux操作系统:一、Ubuntu安装与基本使用】
  • 直流无刷电机控制(FOC):电流模式
  • 在 Flownex 网络中创建传热元件
  • MySQL 如何实现可重复读?
  • screenpipe - 全天候录制屏幕的 AI 助手
  • DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议
  • Flink系统知识讲解之:Flink内存管理详解
  • 【STM32-学习笔记-1-】GPIO
  • CSS响应式
  • spring boot 集成 knife4j
  • 2024年有哪些人工智能书籍推荐?
  • Facebook 隐私变革之路:回顾与展望
  • 04:同步与互斥
  • 【教程】Unity 本地化多语种 | Localization 工具组
  • 【PDF转Word】 PDF在线转word文档 好用!优质网站资源推荐
  • Java 实现 Elasticsearch 查询当前索引全部数据
  • OOM排查思路
  • 蓝桥杯历届真题 #食堂(C++,Java)
  • 探讨人工智能机器人学之路径规划与导航:A*算法、Dijkstra算法等路径规划方法
  • 《零基础Go语言算法实战》【题目 2-12】Go 语言接口的工作原理
  • 冒泡排序基础与实现
  • 微服务的配置共享
  • C# OpenCV机器视觉:波形相似度
  • 深入解析 Spring AI 系列:剖析OpenAI接口接入组件