提到布隆過濾器總想起上大學時候學習的什麼切比雪夫濾波器之類的東西(博主是學通訊的),我發現過濾器一般都是以發明人的名字命名,布隆過濾器是一種布林型判斷器,可以非常高效的判斷乙個物品是否在某個列表裡。有人說判斷乙個item是否在乙個item列表裡,只要將所有item存在資料庫,或者做一層快取存在redis裡,再遍歷的查一次不就得了?這麼做沒問題,但是當item量巨大的時候,會出現快取擊穿等問題。布隆過濾器很好地解決了這個問題,接下來會具體介紹原理。
布隆過濾器會被應用在許多場景下,我接觸比較多的就是推薦場景的應用,接下來講下具體的業務場景和原理。
01 布隆過濾器在推薦場景下的應用
場景1:判斷乙個使用者是否是新使用者
場景2:判斷乙個item是否是新item
這些場景的特點是都不需要獲取具體資訊,只需要知道是否存在這個資訊即可。比如判斷使用者是否是新使用者這個場景,使用者進來後首先判斷是否是新客,如果是新客就走冷啟動推薦邏輯,如果是老客就走傳統的召回+排序的推薦邏輯:
02 布隆過濾器具體原理
用過redis都知道,redis是將資料通過kv形式完整儲存到記憶體裡,並且提供了o(1)複雜度的查詢速度。但是redis受限於記憶體大小,承載不了特別大的資料。比如乙個系統包含10億個賬號,每個賬號佔位100b,那麼全寫到redis裡得有接近100g的記憶體才行,比較難達到。
布隆過濾器之所以快並且占用空間小,主要原因是布隆過濾器並不直接儲存內容,儲存的是雜湊後的結果。比如下面這個圖,假設是
hash(a)的結果,
則第3個、第6個、第10個這三個等於「1」。在查詢的時候只要查詢這三個位置是否是1就能確定a是否存在。
但是因為雜湊存在雜湊衝突這樣的問題,有可能第3個、第6個、第10個這三個等於「1」,但是這三個位置不是代表著a,而是b,因為a的雜湊和b的雜湊結果有衝突,雖然這種概率很低。所以布隆過濾器的返回結果是乙個概率值,返回的是某個對下可能存在的概率是多少。
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...
布隆過濾器
如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...