LevelDB 学习笔记1:布隆过滤器
LevelDB 学习笔记1:布隆过滤器
- 底层是位数组,初始都是 0
- 插入时,用 k 个哈希函数对插入的数字做哈希,并用位数组长度取余,将对应位置 1
- 查找时,做同样的哈希操作,查看这些位的值
- 如果所有位都是 1,说明数字可能存在
- 如果有某个位不是 1,说明数字一定不存在
数学结论
影响布隆过滤器精度的参数有
- 哈希函数的个数 k
- 布隆过滤器位数组的容量 m
- 布隆过滤器插入的数据数量 n
对于给定的 m 和 n,要想最小化错误率(假阳性),k 应该取
要求错误率不大于\(\varepsilon\),k 取最优的情况下,m 应该至少为
布隆过滤器的优缺点
优点
- 空间效率高,可以在使用有限内存的情况下处理海量数据
- 1% 错误率并使用最佳 k 值的布隆过滤器,每个元素只需要使用约 9.6 位
- 插入和查询都是常数复杂度,即
O(k)
缺点
- 存在误判
- 删除元素困难,因为简单地将对应的位置 0 会影响其他元素的判断
- 可以用一种叫 Counting Bloom filter 的变体
LevelDB 中的布隆过滤器
LevelDB 中利用布隆过滤器判断指定的 key 值是否存在于 sstable 中
- 若过滤器认为 key 不在 sstable 中,那么就没必要查找这个 sstable 了
- 否则,key 有可能在 sstable 中,应该做查找
使用布隆过滤器可以有效的减少调用 DB::Get()
时的访存次数,从而减小读放大
LevelDB 中布隆过滤器的实现是 BloomFilterPolicy
,它是接口类 FilterPolicy
的实现
FilterPolicy
类决定了查找过程中要不要读取某个 sstable- 允许用户自定义
FilterPolicy
的子类来应用不同的过滤策略
LevelDB 实现时做了优化,它并不是使用 k 个哈希函数,而是应用 rsa2008 中提出的方法只生成一次哈希值,然后用 double-hashing 的方式生成一组哈希值
uint32_t h = BloomHash(keys[i]);
const uint32_t delta = (h >> 17) | (h << 15); // Rotate right 17 bits
for (size_t j = 0; j < k_; j++) {
const uint32_t bitpos = h % bits;
array[bitpos / 8] |= (1 << (bitpos % 8));
h += delta;
}
一般实现布隆过滤器时,都会选择非加密哈希算法
- 加密哈希算法,比如 MD5、SHA1,安全性较高,难以找到碰撞或通过加密值反推原文
- 非加密哈希算法,比如 MurMurHash、CRC32、FNV,计算速度快
- LevelDB 实现了一个类似于 MurMurHash 的非加密哈希算法
其他应用场景
缓存穿透
做查询的时候,缓存没有命中,就会到数据库中去找,特别地,如果查找一个不存在的 key,那么是一定无法命中缓存,必须去查数据库的,如果有人恶意地使用大量请求来查不存在的 key,就会导致数据库压力过大,甚至崩溃,这种现象称为缓存穿透
用布隆过滤器我们可以直接将这些针对不存在的 key 发起的请求过滤掉
LevelDB 学习笔记1:布隆过滤器的更多相关文章
- LevelDB学习笔记 (1):初识LevelDB
LevelDB学习笔记 (1):初识LevelDB 1. 写在前面 1.1 什么是levelDB LevelDB就是一个由Google开源的高效的单机Key/Value存储系统,该存储系统提供了Key ...
- LevelDB学习笔记 (3): 长文解析memtable、跳表和内存池Arena
LevelDB学习笔记 (3): 长文解析memtable.跳表和内存池Arena 1. MemTable的基本信息 我们前面说过leveldb的所有数据都会先写入memtable中,在leveldb ...
- LevelDB 学习笔记2:合并
LevelDB 学习笔记2:合并 部分图片来自 RocksDB 文档 Minor Compaction 将内存数据库刷到硬盘的过程称为 minor compaction 产出的 L0 层的 sstab ...
- leveldb 学习笔记之VarInt
在leveldb在查找比较时的key里面保存key长度用的是VarInt,何为VarInt呢,就是变长的整数,每7bit代表一个数,第8bit代表是否还有下一个字节, 1. 比如小于128(一个字节以 ...
- angular学习笔记(十六) -- 过滤器(2)
本篇主要介绍angular自定义的过滤器: 直接看例子: <!DOCTYPE html> <html ng-app="MyFilter"> <head ...
- angular学习笔记(十六) -- 过滤器(1)
本篇主要介绍过滤器的基本用法: 过滤器用来对数据进行格式的转换,数据格式的转化与逻辑无关,因此,我们使用过滤器来进行这些操作: {{... | filter2: 参数1,参数2... }} expre ...
- Qt5学习笔记(消息过滤器)
T06EventFilter.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += widgets gui MyWidget.h #i ...
- leveldb学习笔记
LevelDB由 Jeff Dean和Sanjay Ghemawat开发. LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++ 程序库. 特别如下: 1.LevelDb是一 ...
- Vue学习笔记十:过滤器
目录 公共过滤器的写法 简易过滤器+带参数过滤器+多过滤器 私有过滤器 公共过滤器的写法 过滤器的写法还是很简单的 ,如下 <p>{{ msg | filtermsg }}</p&g ...
随机推荐
- ElasticSearch7.3 学习之定制分词器(Analyzer)
1.默认的分词器 关于分词器,前面的博客已经有介绍了,链接:ElasticSearch7.3 学习之倒排索引揭秘及初识分词器(Analyzer).这里就只介绍默认的分词器standard analyz ...
- php——字符串的""和null,empty的关系
public function test(){ $test = ""; if($test==null){ echo "test==null <hr>" ...
- 七天接手react项目 系列 —— react 路由
其他章节请看: 七天接手react项目 系列 react 路由 本篇首先讲解路由原理,接着以一个基础路由示例为起点讲述路由最基础的知识,然后讲解嵌套路由.路由传参,最后讲解路由组件和一般组件的区别,以 ...
- springboot自定义启动图画
小小娱乐,你是不是看到好多文章或段子上有这个 是不是很好玩,其实修改也很简单,就是在springboot的resources下新建一个banner.txt文件,将要输出图案放到txt文件中就好,启动时 ...
- 羽夏看Win系统内核——调试篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- 论文解读(MVGRL)Contrastive Multi-View Representation Learning on Graphs
Paper Information 论文标题:Contrastive Multi-View Representation Learning on Graphs论文作者:Kaveh Hassani .A ...
- 网络编程-Python的socket库
一.网络连接经常用到的函数 sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)参数一:地址簇 socket.AF_INET IPv4(默认) ...
- Tomcat配置Context.xml上下文遇到的坑
注意事项: 1. 在主机的 appBase 之外找到 WAR 和/或目录,并使用带有 docBase 属性的 context.xml 文件来定义它.避免双重部署导致出现不可预知的问题 {context ...
- Mybaits 的优点?
1.基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任 何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理:提供 XML 标签,支持编写动态 SQL ...
- ACM - 动态规划 - P1282 多米诺骨牌
多米诺骨牌由上下 \(2\) 个方块组成,每个方块中有 \(1 \sim 6\) 个点.现有排成行的上方块中点数之和记为 \(S_1\),下方块中点数之和记为 \(S_2\),它们的差为 \(\lef ...