BloomFilter 緩存穿透

需求: BloomFilter 如何防止DB 回源攻擊?

介紹:?

Bloomfilter: 布隆過濾器,?它是由一個很長的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)組成,布隆過濾器可以用于檢索一個元素是否在一個集合中眷细。它的優(yōu)點(diǎn)是空間效率和查詢時間都遠(yuǎn)遠(yuǎn)超過一般的算法扬卷,缺點(diǎn)是有一定的誤識別率。即Bloom Filter報(bào)告某一元素存在于某集合中烁落,但是實(shí)際上該元素并不在集合中。但是如果某個元素確實(shí)沒有在該集合中,那么Bloom Filter 是不會報(bào)告該元素存在于集合中的阀湿,所以不會漏報(bào)。

Bloomfilter 算法邏輯:?

1.??首先需要k個hash函數(shù)瑰妄,每個函數(shù)可以把key散列成為1個整數(shù)?

2.?初始化時陷嘴,需要一個長度為n比特的數(shù)組,每個比特位初始化為0

3.?某個key加入集合時间坐,用k個hash函數(shù)計(jì)算出k個散列值灾挨,并把數(shù)組中對應(yīng)的比特位置為1

4.?判斷某個key是否在集合時,用k個hash函數(shù)計(jì)算出k個散列值竹宋,并查詢數(shù)組中對應(yīng)的比特位劳澄,如果所有的比特位都是1,認(rèn)為在集合中

那么需要多少個K函數(shù)呢? 是不是覺得很神奇蜈七。那下面來算一算秒拔。K 是hash 函數(shù)的個數(shù),m 是?位數(shù)組大小宪潮。插入元素個數(shù) n

最優(yōu)的 k 如下

k = (m/n)ln2.

接下來看看緩存:

緩存問題溯警,一共有以下幾類:

1. 緩存穿透: 請求去查詢一條數(shù)據(jù)庫中不存在的數(shù)據(jù)趣苏,就是數(shù)據(jù)庫和緩存中都不存在,但是請求每次都會打到數(shù)據(jù)庫上面去梯轻。

2. 緩存擊穿: 大量的請求同時查詢一個key的時候食磕,此時key正好失效,就會導(dǎo)正大量的請求打到數(shù)據(jù)庫中去

3.緩存雪崩: 某一時刻發(fā)生大規(guī)模緩存失效的情況喳挑, 比如緩存數(shù)據(jù)庫crash掉了彬伦,導(dǎo)致大量請求打到數(shù)據(jù)庫,DB撐不住就掛掉了伊诵。

4.熱點(diǎn)數(shù)據(jù)失效: 設(shè)置緩存的時候单绑,一般會設(shè)置失效時間,對于一些熱點(diǎn)數(shù)據(jù)曹宴,當(dāng)緩存失效的時候會存在大量的請求打到數(shù)據(jù)庫中去搂橙,從而導(dǎo)致數(shù)據(jù)庫崩掉。

根據(jù)上面·BloomFilter 的介紹笛坦,針對第一個問題区转,緩存穿透“胬可以把存在key的集合都放到BoolmFilter里面废离,再訪問某個key的時候,先會去BloomFilter 查看有沒有key礁芦,存在的話蜻韭,再去查緩存,緩存沒有再去查DB, BloomFilter 判斷沒有key柿扣,就直接返回肖方。?

BloomFilter在時間和空間上占有優(yōu)勢,但是會有一定的錯誤率窄刘。

具體的使用窥妇,可以采用guava 的BloomFilter舷胜, 很簡單娩践。

private static int size = 1000000;

private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size);

? ? public static void main(String[] args) {

? ? ? ? for (int i = 0; i < size; i++) {

? ? ? ? ? ? bloomFilter.put(i);

? ? ? ? }

? ? ? ? long startTime = System.nanoTime(); // 獲取開始時間

? ? ? ? //判斷這一百萬個數(shù)中是否包含29999這個數(shù)

? ? ? ? if (bloomFilter.mightContain(29999)) {

? ? ? ? ? ? System.out.println("命中了");

? ? ? ? }

? ? ? ? long endTime = System.nanoTime();? // 獲取結(jié)束時間

? ? ? ? System.out.println("程序運(yùn)行時間: " + (endTime - startTime) + "納秒");

? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烹骨,隨后出現(xiàn)的幾起案子翻伺,更是在濱河造成了極大的恐慌,老刑警劉巖沮焕,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨岭,死亡現(xiàn)場離奇詭異,居然都是意外死亡峦树,警方通過查閱死者的電腦和手機(jī)辣辫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門旦事,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人急灭,你說我怎么就攤上這事姐浮。” “怎么了葬馋?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵卖鲤,是天一觀的道長。 經(jīng)常有香客問我畴嘶,道長蛋逾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任窗悯,我火速辦了婚禮区匣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒋院。我一直安慰自己沉颂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布悦污。 她就那樣靜靜地躺著铸屉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪切端。 梳的紋絲不亂的頭發(fā)上彻坛,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音踏枣,去河邊找鬼昌屉。 笑死,一個胖子當(dāng)著我的面吹牛茵瀑,可吹牛的內(nèi)容都是我干的间驮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼马昨,長吁一口氣:“原來是場噩夢啊……” “哼竞帽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸿捧,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤屹篓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匙奴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堆巧,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谍肤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啦租。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荒揣,靈堂內(nèi)的尸體忽然破棺而出刷钢,到底是詐尸還是另有隱情,我是刑警寧澤乳附,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布内地,位于F島的核電站,受9級特大地震影響赋除,放射性物質(zhì)發(fā)生泄漏阱缓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一举农、第九天 我趴在偏房一處隱蔽的房頂上張望荆针。 院中可真熱鬧,春花似錦颁糟、人聲如沸航背。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玖媚。三九已至,卻和暖如春婚脱,著一層夾襖步出監(jiān)牢的瞬間今魔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工障贸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留错森,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓篮洁,卻偏偏與公主長得像涩维,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袁波,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

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

  • 一.簡述如何安裝配置apache 的一個開源的hadoop 1.使用root賬戶登陸 2.修改ip 3.修改hos...
    梔子花_ef39閱讀 4,944評論 0 52
  • Java8張圖 11锋叨、字符串不變性 12垄分、equals()方法、hashCode()方法的區(qū)別 13娃磺、...
    Miley_MOJIE閱讀 3,701評論 0 11
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,097評論 1 32
  • 沁園春《國慶》 作者:柳亞子 華夏神州,萬里河山叫倍, 換盡舊顏偷卧〔蛄觯看風(fēng)云世界, 五湖四海听诸,巨龍聳立坐求, 上下千年。 春夏...
    劉偉書法_沈陽閱讀 393評論 0 6
  • 玖月晌梨,她是一個不一樣的女子桥嗤。可以說她是一個逆襲達(dá)人仔蝌,總是一次次刷新周圍人對她的看法泛领。從只能上普通專科的成績敛惊,逆襲到...
    玖月的喵閱讀 138評論 0 2