初学布隆过滤器,布谷鸟过滤器
作者:互联网
用于判断一个元素是否在一个集合中
一个元素占一个bit,初始化为0或1
如何计算
拥有k个hash函数,一个元素加入,进行k次计算得到k个hash值,根据hash值,在维数组中把对应下标位置标为1
如何判断
将元素进行k次哈希运算,得k个值,在数组中判断每个数组是否都为1
False positives概率 ——误差率
由于hash 冲突本来不在布隆过滤器的数据,查询时显示在里面
容量越大,误差下降,插入元素个数增加,误差率上升
如何降低误差率
计算公式
过程
教程根据
随机字符串
模拟app账号
视频素材主键
选择MurMurHash2
使用场景
1.黑名单校验
2.快速去重
3.爬虫URL校验
4.leveldb/rocksdb 快速判断数据是否已经在block中,避免频繁访问磁盘
5.缓存穿透
补充:缓存穿透
概念:查询你一个数据库中不一定存在的数据,
正常流程:有一个缓存数据库,根据key 去查询value,先查缓存,如果key 不存在或已经过期,在去查db(数据库),将查到的数据库中查到的对象,放入缓存,
异常流程:大量数据进入时,没查到缓存,每次都要访问数据库,db压力
使用布隆过滤器解决:
布隆过滤器总结
优点:
1.节省内存空间
2.插入和查询时间复杂度都为1
缺点
1.不支持删除
2.hash冲突,可能会出现假阳性
3.查询性能相对较弱
思考
布隆过滤器适用于数据更新较少的场景
若海量数据模式下,数据量频繁变化,如何高效构建布隆过滤器??
使用mapreduce来并行执行
如何删除布隆过滤器
计数布隆过滤器
布谷鸟过滤器(鸡肋删除
布谷鸟过滤器
布谷鸟hash
解决空闲位置少,易发生hash冲突,循环占位
1.增加hash函数,增加数组上的对应位置,重复,可选其他位置,不占其他位置–>空间利用率95%
2.使得一个hash 函数的计算结果有多个位置,大数组套小数组(内存空间连续–>查询效果好,空间利用率–>85%
计算过程
布谷鸟过滤器算法
通过fingerprint 计算出参数x 的指纹
通过x的指纹fp直接计算出x 的第二个位置
fp = fingerprint(x)
p1 = hash(x)
p2 = p1^hash(fp)//异或
原因:
布谷鸟过滤器只存储了x 的指纹,不存元素,指纹就可算出其他位置
布谷鸟hash结构算法
p1 = hash1(x)%1
p2 = hash2(x)%2
布谷鸟过滤器查找算法
在hash桶查找有没有自己的指纹
缺点:误查询
牺牲数据精度换取空间大小
布谷鸟过滤器删除算法
抹去指纹(或
缺点:误删除
牺牲数据精度换取空间大小
缺陷
如果连续存储相同的位置,将大数组中的小数组位置也占满呢在存储相同元素呢??
结果:存不进去
标签:缓存,hash,布谷鸟,布隆,数组,过滤器 来源: https://blog.csdn.net/m0_51478065/article/details/121456208