开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
说点啥
- 之前我们介绍了redis为什么那么快,有介绍了布隆过滤器这个高级的东东,废了我好大时间。今天我们来看看他的实现原理,正好解释下上文为什么说他不能删除呢?
原理
- 每一个key都会被3次甚至多次hash , 每一次都会将hash值存储到对应的hash中,如 nihao 就分别存储了 1 ,4 ,8 , 这是啥意思呢? 就是说如果 1 , 4 ,8 三个槽都没有值,那么就说明 nihao 肯定没有存储过,因为他三次hash 肯定都回存储的。
- 在然后 下载我们引入了baga 这个单词 , 发现他的三次hash 分别是 1,5,7 . 你会发现nihao 和 baga都出现了 1 这个hash值, 如果你检测到 1 存在内容,那么请问你他到底是 nihao的还是 baga的呢?这时候就出现了无法确定的局面,所以说布隆过滤器无法确定元素是否一定存在, 但是可以确定元素一定不存在。
Hash
- 原理是清楚了,但是为了能够避免 Hash 冲突,我们最好还是能够完善Hash算法尽量减少Hash冲突。而且布隆过滤器如果长度过于小,那么再好的Hash算法也无法避免冲突,在这种极限状态下就会导致一个很无语的问题,一旦布隆过滤器打满, 那么你查询任何数据都有可能是该数据有可能存在的结果,那么布隆过滤器将失去原本的意义。所以好的Hash算法加上适当长度的布隆过滤器才能发挥出来优势
- 常见的策略有,利用布隆过滤器减少磁盘 IO 或者网络请求,正常情况下判断一个元素是否存在,然后再决定是否进行业务处理,这样一套操作下来能够提升心梗。使用布隆过滤器来加速查找和判断是否存在,那么性能很低的哈希函数不是个好选择,推荐 MurmurHash、Fnv 这些。