很庆幸redis4.0以后就内置布隆过滤器了;
127.0.0.1:6379> BF.ADD bloomWall user1
(integer) 1
127.0.0.1:6379> BF.ADD bloomWall user2
(integer) 1
127.0.0.1:6379> BF.ADD bloomWall user3
(integer) 1
127.0.0.1:6379> BF.EXISTS bloomWall user2
(integer) 1
127.0.0.1:6379> BF.EXISTS bloomWall user4
(integer) 0
127.0.0.1:6379>
布隆过滤器
使用场景
- 大流量场景:避免缓存穿透;只返回在布隆过滤器中出现过的相关数据,避免大量请求直接打到数据库服务上
- e.g:用户识别,有的不一定有(存在误差),没有的就是没有
原理
- 存储:S集合中有n个元素,利用k个哈希函数,将S中的每个元素映射到一个长度为m的位(bit)数组B中不同的位置上,这些位置上的二进制数均置为1
- 过滤:检测的元素经过这k个哈希函数的映射后,发现其k个位置上的二进制数不全是1,那么这个元素一定不在集合S中,反之,该元素可能是S中的某一个元素
- 计算函数k值:为了估算出k和m的值,在构造一个布隆过滤器时,需要传入两个参数,即可以接受的误判率fpp和元素总个数n(不一定完全精确)。
- 哈希函数的要求尽量满足平均分布,这样既降低误判发生的概率,又可以充分利用bit数组的空间;
- 公式:;
优势
- 空间:
- 效率: