Level DB --- filter_block

news/2025/1/13 15:50:54/

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.ppmy.cn/news/1562833.html

相关文章

【网络安全 | 漏洞挖掘】通过监控调试模式实现价值$15k的RCE

未经许可,不得转载。 前言 你是否曾遇到过这样一种情况:明明发现了一个可疑的端点,直觉告诉你它可能存在漏洞,但却无法确定其背后的逻辑,更不用说利用它了?在这篇文章中,我将分享一种技术,它让我的黑盒测试变得如同半白盒测试。这种方法帮助我发现了多个漏洞,并最终实…

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)

一、项目背景和建设目标 随着企业业务的不断扩展,仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率,本方案旨在构建一套全面、高效、易用的仓库管理系统(WMS)。该系统将涵盖库…

【微服务】面试 4、限流

微服务限流技术总结 一、微服务业务面试题引入 在微服务业务面试中,限流是重要考点,常与分布式事务、分布式服务接口幂等解决方案、分布式任务调度等一同被考查。面试官一般会询问项目中是否实施限流及具体做法,回答需涵盖限流原因、采用的方…

一个基于Spring Boot的智慧养老平台

以下是一个基于Spring Boot的智慧养老平台的案例代码。这个平台包括老人信息管理、健康监测、紧急呼叫、服务预约等功能。代码结构清晰,适合初学者学习和参考。 1. 项目结构 src/main/java/com/example/smartelderlycare├── controller│ ├── ElderlyCon…

Linux中通过frp实现内网穿透

1、准备工作 准备一台公网服务器(云服务器),推荐阿里云或者腾讯云都可以 需要下载好frp安装包Linux端的和Windows端的安装包 网址:Releases fatedier/frp (github.com)https://github.com/fatedier/frp/releases 2、下载frp_0…

【Linux】Linux命令

目录 ​编辑 系统维护命令 man man:查看 man 手册 sudo passwd 用户名:修改用户密码 su:切换用户 echo ”输出内容“:向终端输出内容,默认换行 date查看当前系统的日期 clear:清屏 df -Th /df -h&…

[SAP ABAP] 使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数据

使用 LOOP AT...ASSIGNING FIELD-SYMBOL... 可以直接修改内表中的数据,而不需要先将内表数据复制到相应的工作区,然后再更新回内表中,从而提高性能 针对上述代码进行优化,我们使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数…

国产游戏崛起,燕云十六移动端1.9上线,ToDesk云电脑先开玩

游戏爱好者的利好消息出新了!网易大型武侠仙游《燕云十六声》正式官宣,移动端要在1月9日正式上线了!你期待手游版的燕云吗?不妨评论区留言说说你的看法。小编分别花了几个小时在台式机电脑和手机上都试了下,欣赏画面还…