1 场景
- 解决新闻推荐过的不再推荐(类似抖音刷过的往下滑动不再刷到)
- 避免缓存穿透问题,用于判断数据是否存在 ----登录接口大家都能访问(用没有的手机号或账号访问)
2原理
现在我们模拟一直去访问接口。数据库和缓存都没有的数据,例如数据访问id为-1的数据,大量访问导致数据库压力过大。
场景:如何知道我们缓存中没有这个"你好呀"这个字符串呢?
存入过程:
1:我们要将 "你好呀"存入到布隆过滤器中去
2:布隆过滤器会将 "你好呀" 进行hash运算, 运算次数不一定几次,根据你设置的命中率决定的,你想要命中率高,就会多次进行hash运算,因为hash算法是有hash冲突的。
hash冲突:hash(你好呀)=5 , hash(你好)=5 这就是hash冲突。
3:第一次运算值=4 会去下标为4的位置,将0改为1.
第二次运算值=5 会去下标为5的位置,将0改为1.
第三次运算值=7 会去下标7的位置,将0改为1.
如何知道 "你好呀" 是有的呢?
1:会将 "你好呀" 进行三次hash运算, 计算结果为 4,5,7
2:我们就会获取 4,5,7这三个小标的值是不是都是1,
3:全部都是,布隆过滤器则认为有该值,如果有一个是0,都认为没有该值
那有没有可能 有一个值 的三次hash算法值和 "你好呀" 的值一模一样啊?
是有的。
所以结论就是: 布隆过滤器认为有的数据不一定有,但是它认为没有的,一定没有。
那当 "你好呀"这个数据已经从缓存中删除了,布隆过滤器你能删除吗?
布隆过滤器不能删除数据
原因:
优缺点:
优点:
1:它是由二进制组成,占的空间特别小。
2:根据下标去查询,所以速度特别快。
缺点:
1:它是有误判的,明明这个数据不存在的?但是却认为存在。hash冲突原理
2:数据删除不了,
如果用本地内存实现,每半个月重启一次服务器,数据丢失,redis实现,重复数据会越来越多。时间越久,结果越不准确。因为数据只增不减
本地内存方式 谷歌的比较好使,redis方式应该需要安装布隆软件,并且需要和redis配置。
先看这个 布谷鸟 有空自己写
Redis--布谷鸟过滤器--使用/原理/实例_IT利刃出鞘的博客-CSDN博客_布谷鸟过滤器
官网也说了有误删的情况
https://mp.weixin.qq.com/s/ZUMS_9AtshRjzS4Rw1UOyQ