栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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。布谷鸟过滤器缺点也很明显,存储空间一定比布隆过滤器大。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/842660.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号