0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

聊聊布隆過濾器

馬哥Linux運(yùn)維 ? 來源:頂尖架構(gòu)師棧 ? 2023-06-30 10:03 ? 次閱讀

前言

布隆過濾器作為一個(gè)精巧且實(shí)用的數(shù)據(jù)結(jié)構(gòu),對于后端程序員來講,學(xué)習(xí)和理解布隆過濾器有很大的必要性。希望通過這篇文章讓更多人了解布隆過濾器的原理,并且會實(shí)際去使用它!

什么是布隆過濾器?

布隆過濾器 (Bloom Filter)是由 Burton Howard Bloom 于 1970 年提出,我們可以把它看作由二進(jìn)制向量(或者說位數(shù)組)和一系列隨機(jī)映射函數(shù)(哈希函數(shù))兩部分組成的數(shù)據(jù)結(jié)構(gòu)。相比于我們平時(shí)常用的的 List、Map、Set 等數(shù)據(jù)結(jié)構(gòu),它占用空間更少并且效率更高,但是缺點(diǎn)是其返回的結(jié)果是概率性的,而不是非常準(zhǔn)確的。理論情況下添加到集合中的元素越多,誤報(bào)的可能性就越大。而且,存放在布隆過濾器的數(shù)據(jù)不容易刪除。

Bloom Filter 會使用一個(gè)較大的 bit 數(shù)組來保存所有的數(shù)據(jù),數(shù)組中的每個(gè)元素都只占用 1 bit ,并且每個(gè)元素只能是 0 或者 1(代表 false 或者 true),這也是 Bloom Filter 節(jié)省內(nèi)存的核心所在。這樣來算的話,申請一個(gè) 100w 個(gè)元素的位數(shù)組只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 kb ≈ 122kb 的空間。

97017dae-168f-11ee-962d-dac502259ad0.png

位數(shù)組

總結(jié):一個(gè)名叫 Bloom 的人提出了一種來檢索元素是否在給定大集合中的數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)是高效且性能很好的,但缺點(diǎn)是具有一定的錯誤識別率和刪除難度。并且,理論情況下,添加到集合中的元素越多,誤報(bào)的可能性就越大。

布隆過濾器使用場景

判斷給定數(shù)據(jù)是否存在:比如判斷一個(gè)數(shù)字是否存在于包含大量數(shù)字的數(shù)字集中(數(shù)字集很大,上億)、 防止緩存穿透(判斷請求的數(shù)據(jù)是否有效避免直接繞過緩存請求數(shù)據(jù)庫)等等、郵箱的垃圾郵件過濾(判斷一個(gè)郵件地址是否在垃圾郵件列表中)、黑名單功能(判斷一個(gè)IP地址或手機(jī)號碼是否在黑名單中)等等。

網(wǎng)頁爬蟲對URL去重,避免爬取相同的 URL 地址。

比如用戶日常刷新聞,每次推薦給該用戶的內(nèi)容不能重復(fù),過濾已經(jīng)看過的內(nèi)容。

以上場景都需要判斷給定數(shù)據(jù)是否存在,因此布隆過濾器主要是為了解決海量數(shù)據(jù)的存在性問題。

布隆過濾器的原理介紹

當(dāng)一個(gè)元素加入布隆過濾器中的時(shí)候,會進(jìn)行如下操作:

使用布隆過濾器中的哈希函數(shù)對元素值進(jìn)行計(jì)算,得到哈希值(有幾個(gè)哈希函數(shù)得到幾個(gè)哈希值)。

根據(jù)得到的哈希值,在位數(shù)組中把對應(yīng)下標(biāo)的值置為 1。

當(dāng)我們需要判斷一個(gè)元素是否存在于布隆過濾器的時(shí)候,會進(jìn)行如下操作:

對給定元素再次進(jìn)行相同的哈希計(jì)算;

得到值之后判斷位數(shù)組中的每個(gè)元素是否都為 1,如果值都為 1,那么說明這個(gè)值在布隆過濾器中,如果存在一個(gè)值不為 1,說明該元素不在布隆過濾器中。

Bloom Filter 的簡單原理圖如下:

971174de-168f-11ee-962d-dac502259ad0.png

Bloom Filter 的簡單原理示意圖

如圖所示,當(dāng)字符串存儲要加入到布隆過濾器中時(shí),該字符串首先由多個(gè)哈希函數(shù)生成不同的哈希值,然后將對應(yīng)的位數(shù)組的下標(biāo)設(shè)置為 1(當(dāng)位數(shù)組初始化時(shí),所有位置均為 0)。當(dāng)?shù)诙未鎯ο嗤址畷r(shí),因?yàn)橄惹暗膶?yīng)位置已設(shè)置為 1,所以很容易知道此值已經(jīng)存在(去重非常方便)。

如果我們需要判斷某個(gè)字符串是否在布隆過濾器中時(shí),只需要對給定字符串再次進(jìn)行相同的哈希計(jì)算,得到值之后判斷位數(shù)組中的每個(gè)元素是否都為 1,如果值都為 1,那么說明這個(gè)值在布隆過濾器中,如果存在一個(gè)值不為 1,說明該元素不在布隆過濾器中。

不同的字符串可能哈希出來的位置相同,這種情況我們可以適當(dāng)增加位數(shù)組大小或者調(diào)整我們的哈希函數(shù)。

綜上,我們可以得出:布隆過濾器說某個(gè)元素存在,小概率會誤判。布隆過濾器說某個(gè)元素不在,那么這個(gè)元素一定不在。

如何實(shí)現(xiàn)布隆過濾器

Guava 實(shí)現(xiàn)

Guava 中布隆過濾器的實(shí)現(xiàn)算是比較權(quán)威的,所以實(shí)際項(xiàng)目中我們不需要自己去實(shí)現(xiàn)一個(gè)布隆過濾器。

首先我們需要在項(xiàng)目中引入 Guava 的依賴:


com.google.guava
guava
28.0-jre

實(shí)際使用如下:

我們創(chuàng)建了一個(gè)最多存放 最多 1500 個(gè)整數(shù)的布隆過濾器,并且我們可以容忍誤判的概率為百分之(0.01)

//創(chuàng)建布隆過濾器對象
BloomFilterfilter=BloomFilter.create(
Funnels.integerFunnel(),
1500,
0.01);
//判斷指定元素是否存在
System.out.println(filter.mightContain(1));
System.out.println(filter.mightContain(2));
//將元素添加進(jìn)布隆過濾器
filter.put(1);
filter.put(2);
System.out.println(filter.mightContain(1));
System.out.println(filter.mightContain(2));

在我們的示例中,當(dāng)mightContain()方法返回true時(shí),我們可以 99%確定該元素在過濾器中,當(dāng)過濾器返回false時(shí),我們可以 100%確定該元素不存在于過濾器中。

Guava 提供的布隆過濾器的實(shí)現(xiàn)還是很不錯的(想要詳細(xì)了解的可以看一下它的源碼實(shí)現(xiàn)),但是它有一個(gè)重大的缺陷就是只能單機(jī)使用(另外,容量擴(kuò)展也不容易),而現(xiàn)在互聯(lián)網(wǎng)一般都是分布式的場景。為了解決這個(gè)問題,我們就需要用到 Redis 中的布隆過濾器了。

Redis 中的布隆過濾器

Redis v4.0 之后有了 Module(模塊/插件)功能,Redis Modules 讓 Redis 可以使用外部模塊擴(kuò)展其功能 ,使用戶可以根據(jù)需要額外集成一些實(shí)用功能。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    15272
  • JAVA語言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20055
  • 過濾器
    +關(guān)注

    關(guān)注

    1

    文章

    424

    瀏覽量

    19484

原文標(biāo)題:聊聊布隆過濾器

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    CN過濾器原理

    CN過濾器原理 CN過濾器采用整體玻璃鋼,耐酸耐堿,一般耐溫65℃。內(nèi)部裝有約半米高的懸浮介質(zhì)層。懸浮過濾介質(zhì)為1-2mm小球,采用高分子材料加工,密度大約
    發(fā)表于 02-25 15:00 ?26次下載

    過濾器的作用

    本視頻主要詳細(xì)介紹了過濾器的作用,分別是濾速高、過濾效果好;強(qiáng)度高、耐腐蝕;靜電作用;過濾物質(zhì);攔截;其次介紹了水龍頭過濾器的作用,最后介紹了活性炭
    的頭像 發(fā)表于 12-12 16:23 ?4.4w次閱讀

    如何使用計(jì)數(shù)型過濾器進(jìn)行可排序密文檢索的方法概述

    云計(jì)算環(huán)境下密文檢索困難,已有的可搜索加密方案存在時(shí)間效率低、文件檢索索引不支持更新、檢索結(jié)果不能實(shí)現(xiàn)按精確度排序等問題。首先基于計(jì)數(shù)型過濾器構(gòu)建文件檢索索引,將文件集中的關(guān)鍵詞哈希映射到計(jì)數(shù)型
    發(fā)表于 01-02 15:17 ?1次下載
    如何使用計(jì)數(shù)型<b class='flag-5'>布</b><b class='flag-5'>隆</b><b class='flag-5'>過濾器</b>進(jìn)行可排序密文檢索的方法概述

    解密高效空氣過濾器的性能及要求

    高效過濾器生產(chǎn)廠商 三河市科豐電氣有限公司高效過濾器。三河市科豐電氣有限公司致力于為通信行業(yè)、暖通行業(yè)、節(jié)能行業(yè),過濾行業(yè)等行業(yè)并提供專業(yè)配套產(chǎn)品和服務(wù)。高效過濾器產(chǎn)品具有
    發(fā)表于 03-19 14:56 ?2005次閱讀

    創(chuàng)新陶瓷過濾器解決方案

    創(chuàng)新陶瓷過濾器解決方案
    發(fā)表于 10-27 14:56 ?16次下載

    絲扣Y過濾器

    絲扣Y過濾器是Y過濾器的一種,普通濾材是不銹鋼或者碳鋼,濾芯普通帶有不銹鋼骨架。 絲扣Y形過濾器有時(shí)也叫做·不銹鋼內(nèi)螺紋Y過濾器。? ? 特性: ? 1.絲扣Y形
    的頭像 發(fā)表于 08-13 17:24 ?4044次閱讀

    絲扣Y過濾器過濾器測試原理簡介

    絲扣Y過濾器是Y過濾器的一種,普通濾材是不銹鋼或者碳鋼,濾芯普通帶有不銹鋼骨架。 絲扣Y形過濾器有時(shí)也叫做·不銹鋼內(nèi)螺紋Y過濾器。? 特性: 1.絲扣Y形
    發(fā)表于 09-05 09:27 ?2476次閱讀

    絲扣Y形過濾器

    絲扣Y形過濾器是保送介質(zhì)管道上不可短少的一種安裝,通常裝置在減壓閥、泄壓閥、定水位閥或其它設(shè)備的進(jìn)口端,用來消弭介質(zhì)中的雜質(zhì),以維護(hù)閥門及設(shè)備的正常運(yùn)用。 絲扣Y形過濾器有時(shí)也叫做·不銹鋼內(nèi)螺紋Y
    的頭像 發(fā)表于 10-24 15:03 ?3735次閱讀

    Y型過濾器

    Y型過濾器是保送介質(zhì)的管道系統(tǒng)不可短少的一種過濾安裝,Y型過濾器通常裝置在減壓閥、泄壓閥、定水位閥或其它設(shè)備的進(jìn)口端,用來? ?介質(zhì)中的雜質(zhì),以維護(hù)閥門及設(shè)備的正常運(yùn)用。Y型過濾用具有
    發(fā)表于 10-25 15:32 ?2574次閱讀

    漢克森過濾器系列介紹

    漢克森過濾器 【1】國產(chǎn)品牌濾芯均為我司生產(chǎn)的替代原廠品牌濾芯,其過濾濾材采用德國原裝進(jìn)口HV公司產(chǎn)品,注冊商標(biāo)為“佳潔”牌。本公司涉及的其它品牌均無品牌意義,只是作為產(chǎn)品型號參照和客戶選型對照
    發(fā)表于 03-01 08:53 ?1053次閱讀
    漢克森<b class='flag-5'>過濾器</b>系列介紹

    過濾器藥液過濾器濾除率測試儀

    過濾器藥液過濾器濾除率測試儀
    的頭像 發(fā)表于 03-09 14:53 ?771次閱讀
    <b class='flag-5'>過濾器</b>藥液<b class='flag-5'>過濾器</b>濾除率測試儀

    一文解析過濾器設(shè)計(jì)原理

    過濾器 是一個(gè)很長的二進(jìn)制向量 和一系列隨機(jī)映射函數(shù) ,用于檢索一個(gè)元素是否在一個(gè)集合中 。 它的空間效率 和查詢時(shí)間 都遠(yuǎn)遠(yuǎn)超過一般的算法 ,但是有一定的誤判率 (函數(shù)返回 true , 意味著元素可能存在,函數(shù)返回
    發(fā)表于 05-12 11:14 ?555次閱讀
    一文解析<b class='flag-5'>布</b><b class='flag-5'>隆</b><b class='flag-5'>過濾器</b>設(shè)計(jì)原理

    貝騰過濾器濾芯

    貝騰過濾器濾芯
    的頭像 發(fā)表于 04-11 15:09 ?960次閱讀
    貝騰<b class='flag-5'>過濾器</b>濾芯

    殺菌過濾器 滅菌過濾器 除菌過濾器

    殺菌過濾器 滅菌過濾器 除菌過濾器
    的頭像 發(fā)表于 03-03 14:03 ?2375次閱讀
    殺菌<b class='flag-5'>過濾器</b> 滅菌<b class='flag-5'>過濾器</b> 除菌<b class='flag-5'>過濾器</b>

    什么情況下需要過濾器

    什么情況下需要過濾器? 先來看幾個(gè)比較常見的例子 字處理軟件中,需要檢查一個(gè)英語單詞是否拼寫正確 在 FBI,一個(gè)嫌疑人的名字是否已經(jīng)在嫌疑名單上 在網(wǎng)絡(luò)爬蟲里,一個(gè)網(wǎng)址是否被訪問過 yahoo
    的頭像 發(fā)表于 11-11 11:37 ?597次閱讀
    什么情況下需要<b class='flag-5'>布</b><b class='flag-5'>隆</b><b class='flag-5'>過濾器</b>