1、Bloom过滤器的作用是什么?
一句话:Bloom过滤器可以解决Redis缓存穿透问题。那什么是缓存穿透呢?比如在电商网站,疯狂的搜索这个网站不卖的东西,缓存里面肯定是没有这些东西,那么这些请求就会转发来数据库进行查询,但数据库也没有啊,那么就会极大的浪费数据库的性能。
2、Bloom过滤器怎么解决缓存穿透的问题?
首先,将电商网站有的东西全部加载到一个集合里,用户搜索一个东西的时候,先去这个集合中从查找,如果没有找到,就不用去数据库了;找到了,根据业务逻辑再决定是直接返回还是再去数据库查询都行。
那就回引出另外一个问题,一个电商网站中的东西那么多,关系型数据库都要分库分表,那么这个集合在内存中,内存不是更放不下了?Bloom过滤器要做的就是如何用小的空间去解决大量数据匹配的过程。
Bloom过滤器用到的就是bitmap里面的标记:
①一个商品会经过几个映射函数的计算,映射到对应的bitmap中的位置,然后进行标记;
②请求的商品经过几个映射函数的计算,可能会被误标记,但是误标记的肯定是极小一部分(<1%),极小部分的穿透不会对数据库造成过大的压力;
③使用bitmap来进行标记,对空间和速度上损耗的成本极低。
其实,如果不使用Bloom过滤器的话,也可以在代码方面实现映射函数算法,Redis仅仅使用bimap来进行标记数据。但是如果将所有的操作能放在Redis这边的都尽量放在Redis,比如集成Bloom过滤器,毕竟Redis是内存级的,而且对CPU的损耗并不大,这样可以让客户端更轻量一些,而且也更符合微服务架构的理念。
3、Bloom过滤器的使用
其实Bloom过滤器的使用非常简单,先调用bf.add将电商网站的商品添加进库,然后用户来搜索的时候,先来Bloom过滤器这边判断一下有没有bf.exists,如果没有的话, 那么数据库肯定是没有的,直接拦截就完了。
4、Bloom过滤器被穿透后的处理
既然Bloom过滤器不能100%保证能拦截到所有的穿透,只要在第一次被穿透以后,程序可以标记一下数据库中没有这个商品,然后在Redis中直接将这个商品标记为没有。再下次来查询这个商品的时候,Bloom过滤器虽然拦不住,但是之前Redis中的标记就可将其拦截。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/111956.html