背景:
讲个使用场景,比如我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的?
你会想到服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。问题是当用户量很大,每个用户看过的新闻又很多的情况下,这种方式,推荐系统的去重工作在性能上跟的上么?
布隆过滤器的巨大用处就是,能够迅速判断一个元素是否在一个集合中。因此他有如下三个使用场景:
1.网页爬虫对URL的去重,避免爬取相同的URL地址
2.反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱(同理,垃圾短信)
3.缓存穿透,将所有可能存在的数据缓存放到布隆过滤器中,当黑客访问不存在的缓存时迅速返回避免缓存及DB挂掉。
1.redis 中布隆过滤器使用
bf.add key value1 添加一个
bf.add key value2
bf.madd key value3 value4 添加多个
bf.exists key value 判断是否存在
2.java 中应用
https://www.cnblogs.com/rinack/p/9712477.html
3.缺点
可能存在误判,当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。
参考:
https://baijiahao.baidu.com/s?id=1611754128562106165&wfr=spider&for=pc