一、作用
判断一个元素是否存在与布隆过滤器
判断不存在:一定不存在
判断存在: 可能不存在(具有一定的误判,误判原因见添加元素和查询元素原理)
布隆过滤器可以解决缓存穿透:
缓存穿透的定义:查询一个不存在的Key,请求直达db,db也没有数据。一直请求,就一直访问db
布隆过滤器如何解决缓存穿透:在redis前面加上一层布隆过滤器
即查询redis前先查询布隆过滤器,如果不存在,将请求直接在redis前面拦截,不会请求到redis和db
如果存在,再放行查询redis和mysql
二、数据结构
布隆过滤器是由一个大型二进制位数组 + 多个无偏hash函数
三、布隆过滤器添加元素和查询元素原理
添加元素:
见上图,比如添加元素 userId1 到过滤器
1、通过k个无偏hash函数计算得到元素 userId1 的k个hash值
2、得到的k个hash值依次取模数组长度,得到数组索引
3、将计算得到的数组索引下标位置数据修改为1
查询元素:
查询元素Liziba是否在过滤器
1、通过k个无偏hash函数计算得到元素 userId1 的k个hash值
2、得到的k个hash值依次取模数组长度,得到数组索引
3、判断索引处的值是否全部为1,但凡有一个0, 则该元素必定不存在与布隆过滤器
如果都为1,可能存在也可能不存在(可能不存在的原因是尽管数组下标都为1,但有可能是被其他元素计算到标记为1(被其他元素污染))
四、优缺点
有一定的误判(查询时数组下标都为1,可能是其他元素标记的)
不能删除元素