Redis 應用-布隆過濾器

Gundy發表於2019-07-05

系列文章

布隆過濾器是什麼?

布隆過濾器可以理解為一個不怎麼精確的 set 結構,當你使用它的 contains 方法判斷某個物件是否存在時,它可能會誤判。但是布隆過濾器也不是特別不精確,只要引數設定的合理,它的精確度可以控制的相對足夠精確,只會有小小的誤判概率。

當布隆過濾器說某個值存在時,這個值可能不存在;當它說不存在時,那就肯定不存在。打個比方,當它說不認識你時,肯定就不認識;當它說見過你時,可能根本就沒見過面,不過因為你的臉跟它認識的人中某臉比較相似 (某些熟臉的係陣列合),所以誤判以前見過你。
套在上面的使用場景中,布隆過濾器能準確過濾掉那些已經看過的內容,那些沒有看過的新內容,它也會過濾掉極小一部分 (誤判),但是絕大多數新內容它都能準確識別。這樣就可以完全保證推薦給使用者的內容都是無重複的。

布隆過濾器的原理

其本質就是一個只包含0和1的陣列。具體操作當一個元素被加入到集合裡面後,該元素通過K個Hash函式運算得到K個hash後的值,然後將K個值對映到這個位陣列對應的位置,把對應位置的值設定為1。查詢是否存在時,我們就看對應的對映點位置如果全是1,他就很可能存在(跟hash函式的個數和hash函式的設計有關),如果有一個位置是0,那這個元素就一定不存在。

Redis 中的布隆過濾器

Redis 官方提供的布隆過濾器到了 Redis 4.0 提供了外掛功能之後才正式登場。布隆過濾器作為一個外掛載入到 Redis Server 中,給 Redis 提供了強大的布隆去重功能。

你可以使用docker映象來體驗

> docker pull redislabs/rebloom # 拉取映象
> docker run -p6379:6379 redislabs/rebloom # 執行容器
> redis-cli # 連線容器中的 redis 服務

當然你也可以自己編譯安裝

下載編譯安裝Rebloom外掛
wget https://github.com/RedisLabsModules/rebloom/archive/v1.1.1.tar.gz
解壓 tar zxvf v1.1.1.tar.gz
cd rebloom-1.1.1
make
redis服啟動新增對應引數
rebloom_module="/usr/local/rebloom/rebloom.so"
daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG --loadmodule $rebloom_module --daemonize yes --pidfile $pidfile"

重啟redis服務

測試命令
bf.add test testValue
命令成功說明開啟成功

布隆過濾器基本使用

主要命令有

  • bf.add 新增元素
  • bf.exists 查詢元素是否存在
  • bf.madd 一次新增多個元素
  • bf.mexists 一次查詢多個元素是否存在

在 redis 中有兩個值決定布隆過濾器的準確率:

  • error_rate:允許布隆過濾器的錯誤率,這個值越低過濾器的位陣列的大小越大,佔用空間也就越大。
  • initial_size:布隆過濾器可以儲存的元素個數,當實際儲存的元素個數超過這個值之後,過濾器的準確率會下降。

redis 中有一個命令可以來設定這兩個值:

bf.reserve test 0.01 100 
  • 第一個值是過濾器的名字。
  • 第二個值為 error_rate 的值。
  • 第三個值為 initial_size 的值。

注意必須在add之前使用bf.reserve指令顯式建立,如果對應的 key 已經存在,bf.reserve會報錯。同時設定的錯誤率越低,需要的空間越大。如果不使用 bf.reserve,預設的error_rate是 0.01,預設的initial_size是 100。

應用場景

主要是解決大規模資料下不需要精確過濾的場景,如檢查垃圾郵件地址,爬蟲URL地址去重,解決快取穿透問題等。

延伸閱讀

布隆過濾器 (Bloom Filter) 詳解
布穀鳥過濾器

本文亦在微信公眾號【小道資訊】釋出,歡迎掃碼關注!
image

相關文章