布隆过滤器与bitmap

bitmap

bitmap是redis中的一个数据结构,是一个二进制数组;由于二进制的值只能是0或者1,所以bitmap更多存的还是某个元素是否存在这个数组中;

布隆过滤器

组成

由bitmap(二进制数组)与hash算法组成;

当一个元素存入到布隆过滤器中时,先将该元素通过hash算法算出一个hash值,用这个hash值与bitmap的长度取模,算到的数据肯定是小于这个bitmap的长度的,然后这个值就是该元素存在于布隆过滤器中的下标位置,将这个位置的值设置为1;

问题

由于主要是通过了hash算法,所以肯定是会遇到hash冲突的问题;hash冲突的问题就是,假设布隆过滤器中的bitmap的长度为12,一个数字6存进去,通过hash算法也算出来6,那6/12表示在下标为6的位置设置成1,这个时候一个数字18进来,想看是否在这个布隆过滤器中存在,但是18/12也等于6,那么虽然18不在数组中,但是查出来的结果是1,所以就可能出现误判;但是如果通过计算,该元素所在位置的值为0,说明这个元素肯定不在这个数组中。

解决办法

1.增加bitmap数组长度,这样分母变大,hash冲突的概率就低,缺点是太耗内存,不可取;

2.用多个hash函数,将元素多进行几次hash计算,获得不同的hash值,每个hash值都与bitmap长度取模,取到多个下标,都设置成1,这样不同的数计算完下标之后,值一模一样的概率就会小很多。

使用

简单点可以使用redis+redission实现:

构造一个RedissionClient,通过redission.getBloomFilter(key)获得一个RBloomFilter<String>实例,接着初始化这个实例:bloomFiltrer.tryInit(100000000L,0.03)(第一个数字代表bitmap数组长度,第二个浮点型代表允许的误差是3%,源码会根据这个误差去算需要多少个hash函数),然后用这个布隆过滤器实例完成塞值操作:bloomFilter.add(vlue),判断当前元素是否存在与布隆过滤器中,用代码:bloomFilter.contains(key)实现,返回true则代表存在,这时候可以去查缓存,缓存中没有就查数据库,返回false代表这个元素肯定不存在系统中,可以直接拒绝请求了。

还可以通过guava实现无redis布隆过滤器,只是因为是代码实现,分布式中肯定不能使用。

总结

布隆过滤器可以有效解决缓存穿透的问题;应用场景有黑名单、邮件垃圾过滤等等;

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis提供的Bitmap可以作为布隆过滤器所需要的位数组的基础。布隆过滤器是一种数据结构,用于判断一个元素是否属于一个集合,具有高效的添加和查询操作。布隆过滤器使用一系列的哈希函数将元素映射到位数组中的多个位置,通过检查这些位置是否被置为1来判断元素是否存在。RedisBitmap就是一种位数组,可以将布隆过滤器的位数组存储在其中。Bitmap提供了位操作的功能,可以用来设置和查询位的状态。通过使用Bitmap,我们可以方便地实现布隆过滤器的添加和查询操作。因此,RedisBitmap正好适用于实现布隆过滤器的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [借助Redis Bitmap实现简单的布隆过滤器](https://blog.csdn.net/huangchonghai/article/details/120340977)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [玩转Redis-Redis布隆过滤器的使用及原理](https://blog.csdn.net/u010887744/article/details/108700911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值