Redis:布隆過濾器

很慶幸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數組的空間;
  • 公式:;

優點

  • 空間:
  • 效率:
相關文章
相關標籤/搜索