很慶幸redis4.0之後就內置布隆過濾器了;redis
127.0.0.1:6379> BF.ADD bloomWall user1
(integer) 1
127.0.0.1:6379> BF.ADD bloomWall user2
(integer) 1
127.0.0.1:6379> BF.ADD bloomWall user3
(integer) 1
127.0.0.1:6379> BF.EXISTS bloomWall user2
(integer) 1
127.0.0.1:6379> BF.EXISTS bloomWall user4
(integer) 0
127.0.0.1:6379>
複製代碼
布隆過濾器
使用場景
- 大流量場景:避免緩存穿透;只返回在布隆過濾器中出現過的相關數據,避免大量請求直接打到數據庫服務上
- e.g:用戶識別,有的不必定有(存在偏差),沒有的就是沒有
原理
- 存儲:S集合中有n個元素,利用k個哈希函數,將S中的每一個元素映射到一個長度爲m的位(bit)數組B中不一樣的位置上,這些位置上的二進制數均置爲1
- 過濾:檢測的元素通過這k個哈希函數的映射後,發現其k個位置上的二進制數不全是1,那麼這個元素必定不在集合S中,反之,該元素多是S中的某一個元素
- 計算函數k值:爲了估算出k和m的值,在構造一個布隆過濾器時,須要傳入兩個參數,便可以接受的誤判率fpp和元素總個數n(不必定徹底精確)。
- 哈希函數的要求儘可能知足平均分佈,這樣既下降誤判發生的機率,又能夠充分利用bit數組的空間;
- 公式:;
優點