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 ...
随机推荐
- 基于selenium实现河海大学自动健康打卡
0.每日健康打卡有点烦 1.所用方法:selenium:需要下载响应浏览器的webdriver 2.注意事项,我感觉唯一要注意的就是页面跳转以后应该怎么操作了(那个时候困扰了我好几天) 3.相应代码: ...
- 5月9日 python学习总结 外键、表之间的关联关系、修改表、清空表内容、复制表
一.外键foreign key 外键约束: 1.必须先创建被关联表才能创建关联表 2.插入记录时,必须先插入被关联表的记录,才能插入关联表(要用到被关联表)的记录 3.若不设置同步更新和同步删除 ...
- WinCE知识介绍
学习WinCE基本开发的步骤: 1.了解WinCE发展史: 2.WinCE开发环境搭建:[软件工具+插件] 3.简单案例: 参考:http://blog.csdn.net/educast/articl ...
- FOC软件中要处理的问题
1. 电流采样时间及通道 FOC需要通过采集相电流来进行控制,采样时间及通道极为关键,在二或三电阻采样方案中,采用如下方式: 在1.6扇区,B.C为采样通道: 在2.3扇区,A.C为采样通道: 在4. ...
- [NPUCTF2020]Baby Obfuscation wp
整体观察main函数,可以发现用户自定义函数和变量存在混淆,猜测为函数名及变量名asc混淆. 对函数进行分析: Fox1为欧几里得算法求最大公约数 Fox5其实是pow Fox4根据逻辑数学的法则实际 ...
- 序列化和反序列化&持久化
java序列化与反序列化全讲解 之前一知半解的,对于序列化的概念,为啥用,哪里用也不清楚,现在深入了解协议,先把序列化这个这个概念和和使用场景搞清楚
- 什么是ORM思想?常用的基于ORM的框架有哪些?各有什么特点?
ORM的全称是Object-Relational Mapping,即对象关系映射.ORM思想的提出来源于对象与关系之间相悖的特性.我们很难通过对象的继承与聚合关系来描述数据表中一对一.一对多以及多对多 ...
- 为什么Java中不支持多重继承?
我发现这个 Java 核心问题很难回答,因为你的答案可能不会让面试官满意,在大多数情况下,面试官正在寻找答案中的关键点,如果你提到这些关键点,面试官会很高兴.在 Java 中回答这种棘手问题的关键是准 ...
- Java并发机制(2)--synchronized与Lock
本内容整理自:博客园-海 子-java并发编程系列-http://www.cnblogs.com/dolphin0520/category/602384.html 1.基础: 1.什么时候出现线程安全 ...
- Kafka 分区的目的?
分区对于 Kafka 集群的好处是:实现负载均衡.分区对于消费者来说,可以提高并发度,提高效率.