Redis布隆過濾器

在redis中我們可以使用布隆過濾器(BloomFilter)來解決緩存穿透的問題, 具體流程就是, 在更新緩存時, 我們會將緩存數據的key添加到布隆過濾器中, 然後在查詢緩存之前, 我們先判斷key在布隆過濾器中是否存在, 存在纔去查詢緩存, 不存在則直接返回空.

布隆過濾器(BloomFilter) 是一種插入和查詢性能非常高的數據結構, 功能有點類似於HashMap, 但相對於HashMap來說, 它的性能更高, 佔用的空間更少.

布隆過濾器的原理

布隆過濾器由一個長度爲n的bit數組和k個哈希函數組成. bit數組的每個元素都只佔用1bit, 值只能是0或1.

一個元素添加到布隆過濾器的過程如下:

  • 使用k個哈希函數對元素值進行hash, 然後再對n求餘, 得到k個哈希值.
  • 以哈希值作爲下標, 將bit數組中對應的值置爲1.

判斷一個元素在布隆過濾器中是否存在的過程如下:

  • 使用k個哈希函數對元素值進行hash, 然後再對n求餘, 得到k個哈希值.
  • 以哈希值作爲下標, 判斷bit數組中對應的值是否爲1.
  • 如果都爲1, 那這個元素可能存在, 如果有一個不爲1, 那這個元素一定不存在.

從上文可以知道布隆過濾器的性能與n和k的值有關, n值越大, 布隆過濾器的錯誤率就越低, k值越大, 保證準確率的元素個數就越少(比如保證100個元素的準確率很高, 超過100個後準確率就明顯下降).

在這裏插入圖片描述

布隆過濾器安裝

布隆過濾器是作爲redis的一個插件安裝的.

(1) github地址

https://github.com/RedisBloom/RedisBloom

(2) 下載包

wget https://github.com/RedisBloom/RedisBloom/archive/v2.0.2.tar.gz

(3) 解壓包

tar -zxvf v2.0.2.tar.gz -C /usr/local/apps/bloomfilter/

(4) 進入解壓後的包中, 進行編譯

cd /usr/local/apps/bloomfilter/RedisBloom-2.0.2
make

(5) 編譯後會生成一個redisbloom.so文件, 配置到redis.conf中

loadmodule /usr/local/apps/bloomfilter/RedisBloom-2.0.2/redisbloom.so

在這裏插入圖片描述

(6) 啓動redis

redis-server /usr/local/redis.conf

(7) 進入redis客戶端

redis-cli

(8) 測試bloomfilter

在這裏插入圖片描述

newFilter爲過濾器的名稱, foo爲key.

(9) 布隆過濾器配置

bf.reserve 過濾器名稱 error_rate initial_size
  • error_rate
    布隆過濾器的錯誤率, 這個值越低位數組的容量就越大.
  • initial_size
    布隆過濾器可以保證準確率的元素個數, 當實際存儲的元素個數超過這個值之後, 過濾器的準確率會下降

在這裏插入圖片描述

發佈了331 篇原創文章 · 獲贊 584 · 訪問量 57萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章