简介
千万级、亿级数据涉及去重/判断数据是否存在,提高效率时,可使用布隆过滤器
Redis官方提供的布隆过滤器,在Redis 4.0提供插件功能之后才正式登场
布隆说存在,可能不存在,但是布隆说不存在,那就一定不存在
基本用法
bf.add: 添加key
bf.exists: 判断key是否存在
原理
数据结构
两部分组成:大型位数组,几个无偏hash函数
位数组
元素为 0 1 的数组
0代表不存在,1代表存在
无偏hash函数
无偏hash函数:hash值计算的比较均匀,目的是映射到位数组时比较随机
多个无偏hash函数来降低错误率
bf.add原理
- key通过hash函数计算获得索引值
- 对位数组长度进行取模运算,得到一个位置
- 多个hash函数,获得多个位置,并置为1
bf.exists原理
- 通过hash计算判断各个位置是否都为1
- 一个为0,则为不存在
- 都为1也可能不存在(概率可调整)
空间占用估计
在线计算链接:
输入key的预估数量和错误率即可
https://krisives.github.io/bloom-calculator/
应用场景
- 抖音推荐,尽量避免推荐用户已经浏览过的内容
- 爬虫URL去重
- 内存中缓存数据,过滤掉大量不存在数据的请求,降低IO(磁盘查询)
- 垃圾邮件拦截