前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >布隆过滤器

布隆过滤器

作者头像
晚上没宵夜
发布于 2022-05-09 13:09:17
发布于 2022-05-09 13:09:17
41100
代码可运行
举报
运行总次数:0
代码可运行

Redis的缓存穿透中了解到布隆过滤器,不禁想了解其奇妙之处

1. 布隆过滤器的作用

判断传入数据是否已经存在,由这个基本功能可以泛生出:

  • 防止Redis缓存穿透
  • 海量数据去重
  • 垃圾邮件过滤

2. 什么是布隆过滤器

布隆过滤器(Bloom Filter)是1970年由一个叫布隆的人提出的,它本质是一个很长的二进制向量(位数组)和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。其优点是空间效率和查询时间都比一般的算法好太多,这是布隆过滤器的出名之处。缺点是有一定的误识别率和删除困难

在布隆过滤器的位数组中,每个元素占一个位(1bit)其内容只能是0或1。其占空间效率小体现:一亿个元素只占用约12MB(100000000bit / 8 / 1024 / 1024 = 11.92MB)

3. 实现原理

我们将传进来的数据进行多次不同的Hash,从而得到多个哈希值,然后将这多个哈希值对应的位数组下标设为1

通过图示我们能大概了解其原理了,布隆过滤器存放的不是数据本身,而是数据的多个Hash值。这样当某个数据被 "存入" 布隆过滤器时,这个数据再次进来,可通过在位数组中查找多个对应的Hash值是否为1,都为1则表明已经存在

缺点也显而易见:1. Hash值计算可能会有冲突,不同的数据 "存入" 布隆过滤器的结果可能相同,也就是说布隆过滤器

只能判断数据不存在,而无法明确判断数据存在。2.存入的数据删除困难

实现关键:

  • Hash函数
  • 位数组长度

4. Google开源的布隆过滤器

1.导包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.2-jre</version>
</dependency>

2.使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test {
    
    public static void main(String[] args) {

        // 创建布隆过滤器,依次为:数据类型,预计数据条数,期望误判率
        BloomFilter bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 10000000, 0.02);

        // "存入" 一千万条数据
        for (int i = 0; i < 10000000; i++) {
            bloomFilter.put(i);
        }

        // 记录误判个数
        int count = 0;
        for (int i = 10000000; i < 20000000; i++) {
            if (bloomFilter.mightContain(i)){
                count++;
            }
        }

        System.out.println("误判总数:" + count);
        System.out.println("误判率:" + (count / 10000000.0) + "%");

    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
误判总数:200914
误判率:0.0200914%

5. Redis实现布隆过滤器

Redis4.0版本之后添加了Module模块,Modules可让Redis使用外部模块扩展其功能。Redis官网导航栏有Modules标签,然后找到RedisBloom下载

下载完后解压编译,记住里面的redisbloom.so路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tar -zxvf RedisBloom-2.2.2.tar.gz
cd RedisBloom-2.2.2
make
pwd  # /opt/RedisBloom-2.2.2

设置配置文件redis.conf

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
################################## MODULES #####################################

loadmodule /opt/RedisBloom-2.2.2/redisbloom.so

基本命令与使用:

  • BF.ADD
  • BF.EXISTS
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> BF.ADD howl 007
(integer) 1
127.0.0.1:6379> BF.EXISTS howl 007
(integer) 1
127.0.0.1:6379> BF.EXISTS howl 008
(integer) 0
127.0.0.1:6379> 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
布隆过滤器
布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
Vincent-yuan
2022/05/06
4780
布隆过滤器
布隆过滤器 | 亿级数据处理原理与实战
布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。主要用于判断一个元素是否在一个集合中。
Rude3Knife的公众号
2020/05/15
2.1K0
硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战
在Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?中我们说到可以使用布隆过滤器避免「缓存穿透」。
码哥字节
2022/04/08
15.8K0
硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战
好玩的布隆过滤器
本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 「“某样东西一定不存在或者可能存在”」。
chengcheng222e
2021/11/04
3870
高频面试考点:解读布隆过滤器
布隆过滤器,起源于 20 世纪 70 年代,是一种高效的数据过滤算法。它基于二进制数组和多哈希函数的结合,以极低的空间占用和高效率著称。由于其底层采用位存储方式,使得存储成本大幅降低,例如,仅需 10KB 的空间便能存储高达百万个元素的数组。
写bug的高哈哈
2025/01/05
1030
高频面试考点:解读布隆过滤器
不了解布隆过滤器?一文给你整的明明白白!
海量数据处理以及缓存穿透这两个场景让我认识了布隆过滤器 ,我查阅了一些资料来了解它,但是很多现成资料并不满足我的需求,所以就决定自己总结一篇关于布隆过滤器的文章。希望通过这篇文章让更多人了解布隆过滤器,并且会实际去使用它!
乔戈里
2019/12/11
9890
不了解布隆过滤器?一文给你整的明明白白!
布隆过滤器原理和使用场景
Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),用于检索元素是否存在于大集合中的数据结构。
卷福同学
2025/02/19
1990
一文搞懂布隆过滤器
在开发软件时,我们经常需要判断一个元素是否在一个集合中,比如,如何判断单词的拼写是否错误(判断单词是否在已知的字典中);在网络爬虫里,如何确认一个网址是否已经爬取过;反垃圾邮件系统中,如何判断一个邮件地址是否为垃圾邮件地址等等。
somenzz
2021/09/14
3610
布隆过滤器(亿级数据过滤算法)原理就是这么简单
我们以演进的方式来逐渐认识布隆过滤器。先抛出一个问题爬虫系统中URL是怎么判重的?你可能最先想到的是将URL放到一个set中,但是当数据很多的时候,放在set中是不现实的。
Java识堂
2020/04/22
1.4K0
布隆过滤器(亿级数据过滤算法)原理就是这么简单
Redis布隆过滤器实现与总结
问题一:原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中?
兔云小新LM
2021/04/13
3.4K0
Redis布隆过滤器实现与总结
redis缓存穿透穿透解决方案-布隆过滤器
相信绝大多数同学都是这么处理请求的,这样用redis能够给mysql抵挡住大部分的请求。其实这样是存在一定的问题的
程序员小饭
2020/10/26
6660
redis缓存穿透穿透解决方案-布隆过滤器
布隆过滤器能解决哪些问题?
举个例子 : 有 50 亿个电话号码,现在给你 10 万个电话号码,如何快速准确的判断出这些号码是否存在?
用户11397231
2024/12/10
1190
布隆过滤器能解决哪些问题?
什么是布隆过滤器?如何实现布隆过滤器?
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它基于位数组和多个哈希函数的原理,可以高效地进行元素的查询,而且占用的空间相对较小,如下图所示:
磊哥
2024/01/05
3240
什么是布隆过滤器?如何实现布隆过滤器?
Redis布隆过滤器
布隆过滤器是一种概率型数据结构(Probabilistic data structures),对插入和查询比较高效,能够计算 “某样东西 一定不存在 或者 可能存在 ”。
玖柒的小窝
2021/12/09
4300
Redis布隆过滤器
redis中的布隆过滤器
redis 在 4.0 的版本中加入了 module 功能,布隆过滤器可以通过 module 的形式添加到 redis 中,所以使用 redis 4.0 以上的版本可以通过加载 module来使用 redis 中的布隆过滤器。但是这不是最简单的方式,使用 docker 可以直接在 redis 中体验布隆过滤器。
名字是乱打的
2021/12/22
6850
Reids(4)——神奇的HyperLoglog解决统计问题
上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以解决很多精确度不高的统计需求。但是如果我们想知道某一个值是不是已经在 HyperLogLog 结构里面了,它就无能为力了,它只提供了 pfadd 和 pfcount 方法,没有提供类似于 contains 的这种方法。
我没有三颗心脏
2020/03/20
7630
Reids(4)——神奇的HyperLoglog解决统计问题
面试官:项目中如何实现布隆过滤器?
谈起“布隆过滤器”相信大家都不陌生,它也算日常面试中的常见面试题了。例如,当面试官在问到 Redis 模块的相关问题时,可能会问到缓存穿透(Redis 四大经典问题之一),而缓存穿透的经典解决方案之一,则是“布隆过滤器”。
磊哥
2024/09/25
2610
Redis系列之什么是布隆过滤器?
前面的学习,我们知道了Redis的很多应用场景,但是最常见的还是缓存,“性能不够,缓存来凑”,在一些高并发的场景合理的使用缓存,还是可以减缓系统压力的。
SmileNicky
2022/07/28
5360
Redis系列之什么是布隆过滤器?
布隆过滤器,一文总结快速掌握,你能够get多少?
假如有一个15亿用户的系统,每天有几亿用户访问系统,要如何快速判断是否为系统中的用户呢?
Java程序猿阿谷
2021/03/11
1.5K0
布隆过滤器,一文总结快速掌握,你能够get多少?
深入浅出Redis(十一):Geosptial、Hypeloglog、Bitmap、Bloom Filter布隆过滤器
Redis提供丰富的数据结构来解决各种场景下的问题,前段时间的一篇文章深入浅出Redis(一):对象与数据结构已经深入浅出的说明Redis中的常用基础对象与数据结构
菜菜的后端私房菜
2024/09/20
3950
相关推荐
布隆过滤器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验