chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

聊聊布隆過(guò)濾器

馬哥Linux運(yùn)維 ? 來(lái)源:頂尖架構(gòu)師棧 ? 2023-06-30 10:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

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

什么是布隆過(guò)濾器?

布隆過(guò)濾器 (Bloom Filter)是由 Burton Howard Bloom 于 1970 年提出,我們可以把它看作由二進(jìn)制向量(或者說(shuō)位數(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)的可能性就越大。而且,存放在布隆過(guò)濾器的數(shù)據(jù)不容易刪除。

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

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

位數(shù)組

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

布隆過(guò)濾器使用場(chǎng)景

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

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

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

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

布隆過(guò)濾器的原理介紹

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

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

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

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

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

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

Bloom Filter 的簡(jiǎn)單原理圖如下:

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

Bloom Filter 的簡(jiǎn)單原理示意圖

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

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

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

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

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

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

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

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


com.google.guava
guava
28.0-jre

實(shí)際使用如下:

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

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

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

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

Redis 中的布隆過(guò)濾器

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






審核編輯:劉清

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

    關(guān)注

    0

    文章

    141

    瀏覽量

    16043
  • JAVA語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

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

    關(guān)注

    1

    文章

    441

    瀏覽量

    20707

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    一文理解過(guò)濾器和布谷鳥過(guò)濾器

    作者:京東保險(xiǎn) 王奕龍 最近在大促中使用到了過(guò)濾器,所以本次借著機(jī)會(huì)整理下相關(guān)內(nèi)容,并了解了布谷鳥過(guò)濾器,希望對(duì)后續(xù)學(xué)習(xí)的同學(xué)有啟發(fā)~
    的頭像 發(fā)表于 11-07 10:10 ?1493次閱讀
    一文理解<b class='flag-5'>布</b><b class='flag-5'>隆</b><b class='flag-5'>過(guò)濾器</b>和布谷鳥<b class='flag-5'>過(guò)濾器</b>

    CN過(guò)濾器原理

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

    過(guò)濾器的作用

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

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

    云計(jì)算環(huán)境下密文檢索困難,已有的可搜索加密方案存在時(shí)間效率低、文件檢索索引不支持更新、檢索結(jié)果不能實(shí)現(xiàn)按精確度排序等問(wèn)題。首先基于計(jì)數(shù)型過(guò)濾器構(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'>過(guò)濾器</b>進(jìn)行可排序密文檢索的方法概述

    解密高效空氣過(guò)濾器的性能及要求

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

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

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

    絲扣Y過(guò)濾器

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

    絲扣Y過(guò)濾器過(guò)濾器測(cè)試原理簡(jiǎn)介

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

    絲扣Y形過(guò)濾器

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

    漢克森過(guò)濾器系列介紹

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

    過(guò)濾器藥液過(guò)濾器濾除率測(cè)試儀

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

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

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

    貝騰過(guò)濾器濾芯

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

    殺菌過(guò)濾器 滅菌過(guò)濾器 除菌過(guò)濾器

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

    什么情況下需要過(guò)濾器

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