布隆過濾器

什么是布隆過濾器

??布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數(shù)。布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優(yōu)點是空間效率和查詢時間都比一般的算法要好的多烁设,缺點是有一定的誤識別率和刪除困難。

實現(xiàn)思想:
??對寫入的數(shù)據(jù)做 H 次 hash 運算定位到數(shù)組中的位置,同時將數(shù)據(jù)改為 1砸彬。當有數(shù)據(jù)查詢時也是同樣的方式定位到數(shù)組中颠毙。比如二進制數(shù)組長度為10,插入元素A砂碉,對A第一次hash過對10取模為1蛀蜜,第二次取模為5,那么將1增蹭、5處的值修改為1滴某。當判斷A是否存在時,按照寫入的計算方式滋迈,計算如果值都為1霎奢,則A存在,否則A不存在饼灿。

public class BloomFilterTest {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        int capacity = 10000000;
        BloomFilter<Integer> integerBloomFilter = BloomFilter.create(Funnels.integerFunnel(), capacity, 0.01);
        for (int i = 0; i < capacity; i++) {
            integerBloomFilter.put(i);
        }

        System.out.println(integerBloomFilter.mightContain(99992));
        long end = System.currentTimeMillis();
        System.out.println(end-start);
    }
}

google 的guava的實現(xiàn):構(gòu)造方法中有兩個比較重要的參數(shù)幕侠,一個是預計存放多少數(shù)據(jù),一個是可以接受的誤報率碍彭。guava 會通過你預計的數(shù)量以及誤報率幫你計算出你應當會使用的數(shù)組大小 numBits 以及需要計算幾次 hash 函數(shù) numHashFunctions

場景

??針對緩存穿透的場景晤硕,可以在init的時候?qū)⑿枰彺娴臄?shù)據(jù)放在布隆過濾器中。如果緩存沒有命中庇忌,先用布隆過濾器判斷是否存在舞箍,如果不存在,在請求數(shù)據(jù)庫漆枚。因為bloomFilter是jdk自帶的创译,只適用單機環(huán)境,集群下init數(shù)據(jù)最好放在redis -BizMap中(最大512M)墙基。

缺點及改進

??布隆過濾器的缺點主要是有一定的誤識別率和刪除困難软族,錯誤識別率可以使用google工具來指定識別率,但是無法達到100%残制。
??目前我們知道布隆過濾器可以支持 add 和 isExist 操作立砸,那么 delete 操作可以么,答案是不可以初茶,例如上圖中的 bit 位 4 被兩個值共同覆蓋的話颗祝,一旦你刪除其中一個值例如 “tencent” 而將其置位 0,那么下次判斷另一個值例如 “baidu” 是否存在的話恼布,會直接返回 false螺戳,而實際上你并沒有刪除它。
??如何解決這個問題折汞,答案是計數(shù)刪除倔幼。但是計數(shù)刪除需要存儲一個數(shù)值,而不是原先的 bit 位爽待,會增大占用的內(nèi)存大小损同。這樣的話翩腐,增加一個值就是將對應索引槽上存儲的值加一,刪除則是減一膏燃,判斷是否存在則是看值是否大于0茂卦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市组哩,隨后出現(xiàn)的幾起案子等龙,更是在濱河造成了極大的恐慌,老刑警劉巖禁炒,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件而咆,死亡現(xiàn)場離奇詭異,居然都是意外死亡幕袱,警方通過查閱死者的電腦和手機暴备,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來们豌,“玉大人涯捻,你說我怎么就攤上這事⊥” “怎么了障癌?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辩尊。 經(jīng)常有香客問我涛浙,道長,這世上最難降的妖魔是什么摄欲? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任轿亮,我火速辦了婚禮,結(jié)果婚禮上胸墙,老公的妹妹穿的比我還像新娘我注。我一直安慰自己,他們只是感情好迟隅,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布但骨。 她就那樣靜靜地躺著,像睡著了一般智袭。 火紅的嫁衣襯著肌膚如雪奔缠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天吼野,我揣著相機與錄音添坊,去河邊找鬼。 笑死箫锤,一個胖子當著我的面吹牛贬蛙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谚攒,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼阳准,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馏臭?” 一聲冷哼從身側(cè)響起野蝇,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎括儒,沒想到半個月后绕沈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡帮寻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年乍狐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片固逗。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡浅蚪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烫罩,到底是詐尸還是另有隱情惜傲,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布贝攒,位于F島的核電站盗誊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隘弊。R本人自食惡果不足惜哈踱,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望长捧。 院中可真熱鬧嚣鄙,春花似錦、人聲如沸串结。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肌割。三九已至卧蜓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間把敞,已是汗流浹背弥奸。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奋早,地道東北人盛霎。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓赠橙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愤炸。 傳聞我的和親對象是個殘疾皇子期揪,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 引自:https://www.cnblogs.com/liyulong1982/p/6013002.html 布隆...
    青玉_f18c閱讀 986評論 0 4
  • 最近,有朋友去面試规个,被問到這么一個問題: 現(xiàn)在有一個非常龐大的數(shù)據(jù)凤薛,假設(shè)全是 int 類型。現(xiàn)在我給你一個數(shù)诞仓,你需...
    habit_learning閱讀 2,508評論 1 4
  • 本文是站在小白的角度去討論布隆過濾器缤苫,如果你是科班出身,或者比較聰明墅拭,又或者真正想完全搞懂布隆過濾器的可以移步活玲。 ...
    CoderBear閱讀 771評論 0 6
  • 寫在前面 在大數(shù)據(jù)與云計算發(fā)展的時代,我們經(jīng)常會碰到這樣的問題帜矾。我們是否能高效的判斷一個用戶是否訪問過某網(wǎng)站的主頁...
    Audience0閱讀 1,751評論 0 0
  • 今天抽空動手學習了一下Drawable這個東東 從內(nèi)心里一直有點懼怕動畫效果 所以決定把基礎(chǔ)打好 以不變應萬變重點...
    思倦ai閱讀 1,003評論 0 0