1.使用场景:推荐系统给用户推荐新闻,避免重复推送。
需要考虑问题:从用户观看历史中筛选出没有看过的新闻进行推送,就需要数据库中频繁的使用exists进行查询,但是当用户量很大时,数据库很难顶住压力。
解决方法:
1.1.使用缓存?但是日子长了,会浪费很大空间,不是长久之计,不是很好的解决办法。
1.2.这时布隆过滤器就可以很好的解决这个需求了,可以节约90%以上的空间,缺点就是稍微有那么一点不准确,存在一定的误判率,但是对于这个新闻推送的可以忽略。
2.什么布隆过滤器
2.1其实布隆过滤器可以看成是一个不是很准确的set结构,只是在使用它的contains方法判断某个对象是否存在时会出现误判。但是它也不是特别的不精准,只要参数设置合理,那么它的精确度可以控制的足够精准,只会有小小的误判。
2.2当布隆过滤器说某个值存在时,那可能就不存在,如果说某个值不存在时,那肯定就是不存在了。
打个比方,当一个人说认识你时可能不认识你,当一个人说不认识你时那肯定就不认识了。当它说见过你时,可能根本没有见过面,只不过可能你的脸和它所认识人中某个人的脸相似度比较高,所以产生误判。
2.3对于上面的场景,当用户看过的新闻,肯定会被过滤掉,对于没有看多的新闻,可能会过滤极少的一部分(误判),但是绝大部分都可以准确识别。这样可以完全保证推送给用户的新闻都是无重复的。
3.centos安装redis的bloomfilter插件
https://blog.csdn.net/u013030276/article/details/88350641
4.bloomfilter使用
4.1 bf.add
语法:[bf.add key options]
127.0.0.1:6379> bf.ad