LSM读放大问题背景

LSM树中读放大的来源是,我们必须寻址多个磁盘驻留表,以便完成读取操作。这是因为我们不一定能预先知道一个磁盘驻留表是否包含要搜索的键指向的数据记录。

LSM使用bloomfilter减少数据扫描

防止表查询的方法之一是在元数据中存储其键的范围(存储给定表中的最小和最大键),并检查要搜索的键是否在该表的范围之内。这一信息是不精确的,它只能告诉我们数据记录是否可能会出现在表中。为了改进这种情况,包括Apache Cassandra和RocksDB在内的许多实现都使用一种称为布隆过滤器(Bloom Filter)的数据结构。

基于概率模型的数据搜索【布隆过滤器(用于集合成员判断)、HyperLogLog(用于估计基数)和Count-Min Sketch】

概率型数据结构通常比它对应的“常规”数据结构具有更高的空间效率。例如,要检查集合成员身份、基数(找出集合中不同元素的数量)或频率(找出某个元素出现的次数),我们必须储存所有集合元素,然后遍历整个数据集以找到结果。而概率结构则允许我们储存近似信息并执行查询,从而产生带有不确定因素的结果。关于这类数据结构的一些众所周知的例子有布隆过滤器(用于集合成员判断)、HyperLogLog(用于估计基数)和Count-Min Sketch。

布隆过滤器概念

隆过滤器是Burton Howard Bloom在1970年提出的,它是一种空间效率很高的概率型数据结构,可以用来测试元素是否是集合的成员。它可能产生假阳性匹配(返回“元素在集合中”的结果,而实际上该元素却不在集合中),但不会出现假阴性匹配(若返回“元素不在集合中”的结果,则保证该元素肯定不是集合的成员)。

布隆过滤器原理

换句话说,可以使用布隆过滤器来判断键是否可能在表中或肯定不在表中。在查询期间跳过布隆过滤器返回“不匹配”的文件,而只访问其余文件,以查明数据记录是否确实存在。使用与磁盘驻留表相关联的布隆过滤器能显著减少读取过程中要访问的表的数量。
布隆过滤器使用一个大的比特数组和多个哈希函数构建。将这些哈希函数应用于表中记录的键,并将哈希值作为数组下标来将其对应比特位设置为1。如果哈希函数所确定的所有比特位都为1,则表示该搜索键在该集合中可能是存在的。
在查找过程中,当检查布隆过滤器中的元素是否存在时,需要再次计算键的哈希函数:如果所有哈希函数确定的位都为1,则返回肯定的结果,说明该项目有一定概率是集合中的成员;如果至少有一个位为0,则我们可以肯定地说该元素不存在于集合中。
应用于不同键的哈希函数可能返回相同的比特位并导致哈希冲突,比特位为1仅表示某个哈希函数为某个键产生了该比特位上的一个置位。

如何提高布隆过滤器的准确度?

假阳性的概率是通过配置比特集的大小和哈希函数的数量来控制的:在较大的比特集中,冲突的概率较小;同样,若拥有更多的哈希函数,则我们也可以检查更多的比特位,这也将产生一个更精确的结果。较大的比特集占用较多的内存,而用较多的哈希函数计算结果又可能会对性能产生负面影响,因此我们必须在可接受的概率和产生的开销之间进行权衡。概率可以从预期的集合大小中计算出来。因为LSM树中的表是不可变的,所以集合大小(表中键的数目)是预先知道的。

布隆过滤器实战

布隆过滤器数据写入

让我们来看一个简单例子,我们有一个16位的比特数组和3个哈希函数,它们产生key1的值3、5和10。我们现在在这些位置上设置比特位。添加下一个键,用哈希函数产生key2的值5、8和14,我们也为key2设置比特位。

一个假阳性的例子:数据可能存在集合中

现在,我们尝试检查key3是否存在于集合中,用哈希函数生成3、10和14。由于在添加key1和key2时所有三个位都被置位,所以我们会遇到这样一种情况,即布隆过滤器返回一个假阳性报告:key3从未被添加到那里,但所有被计算的位都被置位。但是,由于布隆过滤器只声明元素可能在表中,所以这个结果是可以接受的。

一个真阴性的例子:数据一定不在集合中

如果我们尝试查找key4并由哈希函数得到值5、9和15,那么我们会发现只有第5位被置位,而其他两位未置位。即使只有其中一位未置位,我们也可以肯定该元素从未被添加到过滤器中。

布隆过滤器原理和使用相关推荐

  1. 布隆过滤器原理和基于BloomFilter的误判率展示

    布隆过滤器 布隆过滤器原理 布隆过滤器是由n个Hash函数和一个二进制数组组成. 如图所示(参考,hash函数可以多个) 1.保存操作 发来一个请求数据hello 对数据hello经过三次hash运算 ...

  2. 布隆过滤器误判怎么办为什么会_五分钟小知识:布隆过滤器原理和应用分析

    布隆过滤器出现的背景和要解决的问题 Wikipedia 上面提到布隆过滤器早在 1970 年就被提出来,很难想象在当时那个年代它的主要用途是什么,估计当时提出也是一个数据模型吧. 在互联网时代,每天会 ...

  3. 布隆过滤器原理深度剖析

    HBase布隆过滤器原理深度剖析 1. 数据结构与原理 1.1 初始化 1.2 变量映射 1.3 变量检索 1.4 总结 2. 过滤器特性 2.1 误判率 2.2 判断特点 3. 案列代码 1970年 ...

  4. 布隆过滤器原理及在推荐业务的应用

    提到布隆过滤器总想起上大学时候学习的什么切比雪夫滤波器之类的东西(博主是学通信的),布隆过滤器是一种布尔型判断器,可以非常高效的判断一个物品是否在某个列表里.有人说判断一个item是否在一个item列 ...

  5. C++ 布隆过滤器原理及实现

    概念 布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都 ...

  6. 详解各种布隆过滤器原理及使用场景

    文章目录 1.什么是布隆过滤器? 2.布隆过滤器的原理介绍 3.布隆过滤器使用场景 4.通过 Java 编程手动实现布隆过滤器 5.利用Google开源的 Guava中自带的布隆过滤器 6.Redis ...

  7. 布隆过滤器原理(有眼睛就能看懂)

    作用嘛就是用来过滤非法key,避免缓存穿透(请求直接打到数据库),布隆过滤器底层用的是位数组,不仅节省空间,性能也嘎嘎猛,而且占用内存不会随着使用变大 先贴demo后BB public class M ...

  8. 布隆过滤器原理及实践

    1 背景 现在有海量的数据,而这些数据的大小已经远远超出了服务器的内存,现在再来一条数据,如何快速高效判断这条数据在不在其中? 如果这些数据是存在数据库中的,考虑索引,分库分表:或者考虑其他目前主流的 ...

  9. 布隆过滤器原理很好懂

    总结: 布隆过滤器会接收数据并使用几个哈希函数进行计算,计算后如果符合对应的结果,就会在01byte数组的对应索引位置上set值为1.当每个哈希函数对应的索引位置都为1是,放行,否则拦截. 优缺点 布 ...

最新文章

  1. 《MINECRAFT我的世界 新手完全攻略(第3版)》一1.4 关于快照版
  2. Win 10 UWP开发系列:设置AppBarButton的图标
  3. python 类中方法的动态特性
  4. 通过QEMU 和 IDA Pro远程调试设备固件
  5. Linux 下 YUM 安装 PHP 5.5
  6. 深度学习笔记——基于传统机器学习算法(LR、SVM、GBDT、RandomForest)的句子对匹配方法
  7. python调用cmd命令释放端口_Python——cmd调用(os.system阻塞处理)(多条命令执行)...
  8. 普通技术人员如何快速成长为合格的CTO
  9. 打开游戏要运行19.8亿次 if 语句?黑客嘲讽RockStar游戏代码太烂了
  10. java中几个常用的开源常用工具类
  11. FFT为什么要加窗函数?
  12. MP4格式转换为AMV格式
  13. 万年历,java如何实现日历查询
  14. Cameralink转HDMI接口转换模块
  15. mysql导出的身份证格式错误
  16. pytorch深度学习入门笔记
  17. c语言间接级别不同_一个超复杂的间接递归——C语言初学者代码中的常见错误与瑕疵(6)...
  18. [人生故事] -- 美国总统的幽默
  19. Unity升级2018与Google Android64位支持
  20. ubuntu远程访问win7登录后语言为繁体字的解决办法

热门文章

  1. 卸载cuda11.0并安装cuda11.1和cudnn
  2. 求[1,n]中所有素数之和
  3. Spring面试之循环依赖(allowCircularReferences)
  4. java 1.7 找不到 javaxmail_无法找到Org.springframework.mail.javamail.JavaMailSender类型的Bean?...
  5. 模型商业化时产权保护有何技术手段?protege 专为数据分析/机器学习建模而打造
  6. 全球变脸应用新突破:实时秒变娃娃脸、全机型覆盖,断网也能用
  7. AUTODYN 加速并行计算
  8. 华为企业园区网络建设技术方案建议书
  9. 2021年熔化焊接与热切割考试试卷及熔化焊接与热切割模拟试题
  10. C# 2012QQ空间最新加密方式