【闲聊杂谈】Redis中Bloom过滤器的使用

导读:本篇文章讲解 【闲聊杂谈】Redis中Bloom过滤器的使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1、Bloom过滤器的作用是什么?

一句话:Bloom过滤器可以解决Redis缓存穿透问题。那什么是缓存穿透呢?比如在电商网站,疯狂的搜索这个网站不卖的东西,缓存里面肯定是没有这些东西,那么这些请求就会转发来数据库进行查询,但数据库也没有啊,那么就会极大的浪费数据库的性能。

2、Bloom过滤器怎么解决缓存穿透的问题?

首先,将电商网站有的东西全部加载到一个集合里,用户搜索一个东西的时候,先去这个集合中从查找,如果没有找到,就不用去数据库了;找到了,根据业务逻辑再决定是直接返回还是再去数据库查询都行。

那就回引出另外一个问题,一个电商网站中的东西那么多,关系型数据库都要分库分表,那么这个集合在内存中,内存不是更放不下了?Bloom过滤器要做的就是如何用小的空间去解决大量数据匹配的过程。

【闲聊杂谈】Redis中Bloom过滤器的使用

Bloom过滤器用到的就是bitmap里面的标记:

①一个商品会经过几个映射函数的计算,映射到对应的bitmap中的位置,然后进行标记;

②请求的商品经过几个映射函数的计算,可能会被误标记,但是误标记的肯定是极小一部分(<1%),极小部分的穿透不会对数据库造成过大的压力;

③使用bitmap来进行标记,对空间和速度上损耗的成本极低。

其实,如果不使用Bloom过滤器的话,也可以在代码方面实现映射函数算法,Redis仅仅使用bimap来进行标记数据。但是如果将所有的操作能放在Redis这边的都尽量放在Redis,比如集成Bloom过滤器,毕竟Redis是内存级的,而且对CPU的损耗并不大,这样可以让客户端更轻量一些,而且也更符合微服务架构的理念。

3、Bloom过滤器的使用

【闲聊杂谈】Redis中Bloom过滤器的使用

其实Bloom过滤器的使用非常简单,先调用bf.add将电商网站的商品添加进库,然后用户来搜索的时候,先来Bloom过滤器这边判断一下有没有bf.exists,如果没有的话, 那么数据库肯定是没有的,直接拦截就完了。

4、Bloom过滤器被穿透后的处理

既然Bloom过滤器不能100%保证能拦截到所有的穿透,只要在第一次被穿透以后,程序可以标记一下数据库中没有这个商品,然后在Redis中直接将这个商品标记为没有。再下次来查询这个商品的时候,Bloom过滤器虽然拦不住,但是之前Redis中的标记就可将其拦截。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/111956.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!