吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

聊聊布隆過濾器

馬哥Linux運維 ? 來源:頂尖架構師棧 ? 2023-06-30 10:03 ? 次閱讀

前言

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

什么是布隆過濾器?

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

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

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

位數組

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

布隆過濾器使用場景

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

網頁爬蟲對URL去重,避免爬取相同的 URL 地址。

比如用戶日常刷新聞,每次推薦給該用戶的內容不能重復,過濾已經看過的內容。

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

布隆過濾器的原理介紹

當一個元素加入布隆過濾器中的時候,會進行如下操作:

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

根據得到的哈希值,在位數組中把對應下標的值置為 1。

當我們需要判斷一個元素是否存在于布隆過濾器的時候,會進行如下操作:

對給定元素再次進行相同的哈希計算;

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

Bloom Filter 的簡單原理圖如下:

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

Bloom Filter 的簡單原理示意圖

如圖所示,當字符串存儲要加入到布隆過濾器中時,該字符串首先由多個哈希函數生成不同的哈希值,然后將對應的位數組的下標設置為 1(當位數組初始化時,所有位置均為 0)。當第二次存儲相同字符串時,因為先前的對應位置已設置為 1,所以很容易知道此值已經存在(去重非常方便)。

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

不同的字符串可能哈希出來的位置相同,這種情況我們可以適當增加位數組大小或者調整我們的哈希函數。

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

如何實現布隆過濾器

Guava 實現

Guava 中布隆過濾器的實現算是比較權威的,所以實際項目中我們不需要自己去實現一個布隆過濾器。

首先我們需要在項目中引入 Guava 的依賴:


com.google.guava
guava
28.0-jre

實際使用如下:

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

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

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

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

Redis 中的布隆過濾器

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






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • URL
    URL
    +關注

    關注

    0

    文章

    139

    瀏覽量

    15478
  • JAVA語言
    +關注

    關注

    0

    文章

    138

    瀏覽量

    20178
  • 過濾器
    +關注

    關注

    1

    文章

    432

    瀏覽量

    19734

原文標題:聊聊布隆過濾器

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    一文理解過濾器和布谷鳥過濾器

    作者:京東保險 王奕龍 最近在大促中使用到了過濾器,所以本次借著機會整理下相關內容,并了解了布谷鳥過濾器,希望對后續學習的同學有啟發~
    的頭像 發表于 11-07 10:10 ?793次閱讀
    一文理解<b class='flag-5'>布</b><b class='flag-5'>隆</b><b class='flag-5'>過濾器</b>和布谷鳥<b class='flag-5'>過濾器</b>

    CN過濾器原理

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

    過濾器的作用

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

    如何使用計數型過濾器進行可排序密文檢索的方法概述

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

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

    高效過濾器生產廠商 三河市科豐電氣有限公司高效過濾器。三河市科豐電氣有限公司致力于為通信行業、暖通行業、節能行業,過濾行業等行業并提供專業配套產品和服務。高效過濾器產品具有
    發表于 03-19 14:56 ?2052次閱讀

    創新陶瓷過濾器解決方案

    創新陶瓷過濾器解決方案
    發表于 10-27 14:56 ?16次下載

    絲扣Y過濾器

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

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

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

    絲扣Y形過濾器

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

    漢克森過濾器系列介紹

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

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

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

    一文解析過濾器設計原理

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

    貝騰過濾器濾芯

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

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

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

    什么情況下需要過濾器

    什么情況下需要過濾器? 先來看幾個比較常見的例子 字處理軟件中,需要檢查一個英語單詞是否拼寫正確 在 FBI,一個嫌疑人的名字是否已經在嫌疑名單上 在網絡爬蟲里,一個網址是否被訪問過 yahoo
    的頭像 發表于 11-11 11:37 ?696次閱讀
    什么情況下需要<b class='flag-5'>布</b><b class='flag-5'>隆</b><b class='flag-5'>過濾器</b>
    百家乐手机投注平台| 网上百家乐官网公司| 广灵县| 大发888sut8| 百家乐关台| 正品百家乐官网玩法| 百家乐官网庄闲概率| 马公市| 大发888 备用6222| 百家乐反缆公式| 互博百家乐现金网| 百家乐官网建材| 免佣百家乐官网赌场优势| 百乐门线上娱乐城| 大发888官网是多少| 新濠峰百家乐的玩法技巧和规则| 百家乐官网单机破解版| 百家乐官网3号眨眼技术| 六合彩网址| 六合彩开| 大发888 娱乐场| 百家乐博赌城| 百家乐开户投注| 百家乐微心打法| 天天百家乐官网的玩法技巧和规则 | 恒丰百家乐的玩法技巧和规则 | 老虎机上分器| 同花顺百家乐的玩法技巧和规则 | 大发888游乐城| 反赌百家乐的玩法技巧和规则| 澳门百家乐秘积| 百家乐如何计牌| 网上赌百家乐官网的玩法技巧和规则 | 缅甸百家乐官网博彩| 百家乐官网真人娱乐场| 旌德县| 玫瑰国际娱乐城| 优博娱乐在线| 大发888 大发888游戏平台| 威尼斯人娱乐城 线路畅通中心| 赌场百家乐的玩法技巧和规则|