面试官:大量请求 Redis 不存在的数据,从而打倒数据库,你有什么方案?

d64f9ef70fd4070e16674f2d98c0e954.png

若有收获,请记得分享和转发哦

大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景:

我们业务后端涉及数据库,当请求消息查询某些信息时,可能先检查缓存中是否有相关信息,有的话返回,如果没有的话可能就要去数据库里面查询,这时候有一个问题,如果很多请求是在请求数据库根本不存在的数据,那么数据库就要频繁响应这种不必要的IO查询,如果再多一些,数据库大多数IO都在响应这种毫无意义的请求操作。

那么如何将这些请求阻挡在外呢?过滤器由此诞生

布隆过滤器

布隆过滤器(Bloom Filter)大概的思路就是,当你请求的信息来的时候,先检查一下你查询的数据我这有没有,有的话将请求压给数据库,没有的话直接返回,是如何做到的呢?

3bd0529178f0b002958ac9b104e17ae2.png

如图,一个bitmap用于记录,bitmap原始数值全都是0,当一个数据存进来的时候,用三个Hash函数分别计算三次Hash值,并且将bitmap对应的位置设置为1。

上图中,bitmap 的1,3,6位置被标记为1,这时候如果一个数据请求过来,依然用之前的三个Hash函数计算Hash值,如果是同一个数据的话,势必依旧是映射到1,3,6位,那么就可以判断这个数据之前存储过,如果新的数据映射的三个位置,有一个匹配不上,假如映射到1,3,7位,由于7位是0,也就是这个数据之前并没有加入进数据库,所以直接返回。

b175b2869ac61cba8f1ed99d5e60627a.png

0990e76c253e9c4e6bd4c701415046e0.png

36cabc76305587e2b4205da5310bfa94.png

67d1ebb445f65e83573599985666227f.png

a363631f54d009b597d16618314676ce.png

7ed05d6bf61b5585f295ea838df7a7fa.png

bfa2e7a9d69d6c3714e2ef2116c00854.png

aad4693cb80d89e6430fbfde14e94ea7.png

fabc7de7e62493a11d4ca1fc21670910.png

99b4778461d8111559fe148fe11a970f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值