布隆过滤器BloomFilter原理学习

什么是布隆过滤器

适用场景

  • 从海量的数据中判断一条数据是否存在。
  • 判断请求,做拦截,避免缓存穿透。
  • 利用布隆过滤器减少磁盘 IO 或者网络请求。
  • 垃圾邮件过滤,新用户判断
  • ...

实现原理

数据结构

布隆过滤器可以看作一个bit数组,初始的所有元素为0。

当我们需要映射Data1至布隆过滤器时,需将Data1做多次不同的Hash运算,将Hash函数生成的Hash值作为映射地址。
假设Data1通过Hash函数得到的值为1,4,8。将Hash值指向的地址上存储的值置为1。

同样的,映射Data2通过Hash运算得到的地址2,5,8。其中一个Hash函数得到的值为8与Data1得到的值相同

此时,我们查询Data3是否存在于过滤器中,假设Data通过Hash运算得到的值为2,5,6。而6这个位置的值为0,也就是说没有任何一个值映射到该位置,可以确定Data3这个值一定不存在。
此前,在映射Data2时得到的一个值8与Data1相同,也就是说同一个地址可以被多次映射,如果一个数据通过Hash得到的多个结果指向的对应数组位置上的值皆不为0,是无法判断映射的数据一定存在。验证了布隆过滤器只能判断一个东西一定不存在或者可能存在。

BloomFilter&HashMap

优缺点

Java实现

Redis实现

posted @ 2021-05-06 13:53  Ho-Yu-Fung  阅读(72)  评论(0编辑  收藏  举报