【Redis】谈谈我对Redis布隆过滤器的理解

本文介绍了布隆过滤器和位图两种高效数据结构,它们在处理大规模数据时能节省空间并快速查询。布隆过滤器常用于判断元素是否存在,例如在IP黑名单场景中,通过哈希映射将IP地址存储,减少数据库查询。尽管可能存在误判,但结合多次哈希可降低错误率。位图则通过0和1表示元素存在与否。在缓存穿透问题上,布隆过滤器可以预先过滤掉不存在的请求,减轻数据库压力。通过引入布隆过滤器,可以优化服务响应,防止恶意请求对系统的冲击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是布隆过滤器

  • 布隆过滤器是一种占用空间很小的数据结构(位图)也可以理解为数组,用于检索一个元素是否在一个集合中;
  • 空间效率和查询时间都比一般的算法要好的多,缺点是有一定的错误识别率删除困难

什么是位图

  • 是一个有序的数组,只有两个值(0 和 1);
  • 0-代表不存在,1-代表存在;

举例

上面有说过,布隆过滤器的主要作用为:检索一个元素是否在一个集合;

举一个比较典型的例子:

  • 如果你的网站被爬虫爬取了,而且这个爬虫还会经常切换ip,那么你就要获取到爬虫的ip,之后加入黑名单,等到爬虫再次访问时,服务就会拒绝响应;
  • 那么这么多的ip,需要放在哪里呢?总不能放在数据库吧,这样每次都要请求数据库去查询数据,是很不明智的;
  • 所以,使用布隆过滤器来存放ip是个不错的选择;

这里我只是举一个个例,同样的,布隆过滤器也可以解决缓存穿透的问题;

ip黑名单工作逻辑

  • 拿黑名单ip的功能举例,假设检测出爬虫ip为:120.254.4.213,现在想将这个ip加入黑名单,那么就要将ip地址进行HASH();

  • 得到的值存放到位图上,此步骤也就是做关系映射,将ip地址映射到位图的位置上;

  • 下次可以直接进行查询,如果下次查询得到的位置为1,那么这个ip很有可能在黑名单中(误判),否则,就一定不在黑名单中;

在这里引入一张偷来的图,在数组中为1的,既是某个ip对应的位置(一个ip对应一个位置)
在这里插入图片描述

hash冲突

  • 在这里会出现一个问题,既然是通过hash算法去得到的值,肯定是会遇到hash碰撞的问题;
  • 也许某一个ip并没有在黑名单中,但经过hash()算法之后,恰好对应的位置为1,这时就可以通过多次hash来避免这种情况;

目前Java已经有了很多布隆过滤器相关的开源库,首选Google的Guava

解决缓存穿透工作逻辑

  • 同样的,当客户端请求在redis中没有命中时,会去请求mysql,这逻辑看起来没有任何问题;
  • 但当大量不存在的请求过来时,mysql数据库肯定是扛不住的;
  • 这时候布隆过滤器就派上用场了,当请求过来时,先经过布隆过滤器,如果显示有数据,则去查询mysql;
  • 如果布隆过滤器显示无此数据,则直接返回给前端;
  • 这种逻辑就万无一失了

从容器的角度来说

  • 如果布隆过滤器判断元素在集合中存在,那么不一定存在(学名叫 假阳性)
  • 如果布隆过滤器判断不存在,那么就一定不存在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

素人岳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值