布隆过滤器的学习
1、Bloom Filter是什么?
由一个初值为0的bit数组和多个hash函数构成,用于快速判断某个数据是否存在。
当有变量加入集合时,通过N个hash函数映射到bit数组中,将其置为1
查询某个变量的时候我们只要看看这些点是不是都是 1, 就可以大概率知道集合中有没有它了
2、Bloom Filter的特点
- 高效地插入和查询,占用空间少
- Bloom Filter判定存在,是极大可能在;判定不存在,则肯定不存在
- 可以添加元素,但不能删除
- 有误判率,只会发生在没有添加过的元素
3、Bloom Filter使用场景
3.1、解决缓存穿透问题
缓存穿透:
一般情况下,先查询缓存redis是否有该条数据,缓存中没有时,再查询数据库。
当数据库也不存在该条数据时,每次查询都要访问数据库,这就是缓存穿透。
缓存透带来的问题是,当有大量请求查询数据库不存在的数据时,就会给数据库带来压力,甚至会拖垮数据库。
使用布隆过滤器解决缓存穿透问题:
- 把已存在数据的key存在布隆过滤器中,相当于redis前面挡着一个布隆过滤器。
- 当有新的请求时,先到布隆过滤器中查询是否存在:
- 如果布隆过滤器中不存在该条数据则直接返回;
- 如果布隆过滤器中已存在,才去查询缓存Redis,如果Redis里没查询到则穿透到MySQL数据库
3.2、黑名单校验
假设黑名单的数量是数以亿计的,存放起来就是非常耗费存储空间的,布隆过滤器则是一个较好的解决方案。
把所有黑名单都放在布隆过滤器中,在收到邮件时,判断邮件地址是否在布隆过滤器中即可。
4、Bloom Filter实现步骤
-
初始化一个长度为m的bit数组
-
使用多个hash函数对key进行运算,得到下标索引,将其置为1,当实际长度大于初始化长度时,进行扩容
-
将key通过多个hash函数进行运算,查看对应位置是否全为1。全为1,则极可能存在。如果这几个位置有一个位为0,则不存在。可能出现误判,如:
y通过多个hash函数进行运算,查看对应位置是否全为1。全为1,则极可能存在。如果这几个位置有一个位为0,则不存在。可能出现误判,如: