redis学习笔记(八)布隆过滤器

一、为什么要使用布隆过滤器?

问题场景:
如果你有张user表,id以自增方式储存,有个接口可以get(id)获取用户信息。这时有个黑客想搞崩你的网站,不停的调用get(-1),get(-2)之类的不存在的id,导致你缓存命中不了用户缓存数据,穿透到数据库承受不住这个并发量。你如何解决这个问题?(这个问题也叫缓存穿透)
思考:
1.负数直接返回,是一种解决方案,但无法解决传正数但也不存在的大id。而且写死规则也不是一种好的方案。
2.如果从数据库中查到不存在,也缓存在redis中,但这样就会占用大量的redis内存。
3.有一种过滤器,来个id可以判断是否在数据库中是否存在。这就是布隆过滤器。

二、布隆过滤器原理

布隆过滤器实际上是bitmap+hash算法实现的。
原理如图所示:
在这里插入图片描述
如图,id为1、2、3都是真实存在的数据。hash后指向的偏移量下标都改成1。而id=-1的hash下标指向了一个0,则表示id=-1肯定在数据中不存在。
布隆过滤器的性质:
如果hash后的至少有一个值指向了0,则说明数据一定不存在
如果hash后的值全部指向了1,只能说明数据可能存在

由上可知,布隆过滤器也不是%100能过滤不存在请求的,是有一定比例过滤的,这个比例和hash次数和bitmap长度有关(可自行配置或实现)。

三、3种实现方式

client自己实现(guava自带布隆过滤器,单纯用java的内存实现)
client算法+redis的bimap(自己写代码)
redis装布隆过滤器插件(省事)

四、redis装布隆过滤器插件流程

1.去redis官网寻找布隆过滤器插件下载地址:
https://redis.io/docs/modules/
我找回来的是https://github.com/RedisBloom/RedisBloom/archive/refs/heads/master.zip
2.下载

wget
https://github.com/RedisBloom/RedisBloom/archive/refs/heads/master.zip

3.解压

unzip master.zip

cd master

5.编译

make

6.放到redis目录

cp redisbloom.so /opt/yangzhicheng/redis6

7.运行redis服务并加载布隆过滤器

redis-server --loadmodule /opt/yangzhicheng/redis6/redisbloom.so

8.使用布隆过滤器相关命令

BF.ADD ooxx abc // ooxx这个过滤器中加入abc元素
BF.EXISTS ooxx abc //ooxx是否包含abc这个元素

五、布隆过滤器缺点及拓展

布隆过滤器因为是bitmap实现,所以只能add,不能del
解决方案:如果业务需要del,可使用布谷鸟过滤器,布谷鸟过滤器不用bitmap实现,二进制位直接改成数字list。布谷鸟过滤器缺点也很明显,存储空间一定比布隆过滤器大。

如果有写错的地方,欢迎大家指正,感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值