Redis應用-布隆過濾器

系列文章html

布隆過濾器是什麼?

布隆過濾器能夠理解爲一個不怎麼精確的 set 結構,當你使用它的 contains 方法判斷某個對象是否存在時,它可能會誤判。可是布隆過濾器也不是特別不精確,只要參數設置的合理,它的精確度能夠控制的相對足夠精確,只會有小小的誤判機率。當布隆過濾器說某個值存在時,這個值可能不存在;當它說不存在時,那就確定不存在。git

布隆過濾器的原理

其本質就是一個只包含0和1的數組。具體操做當一個元素被加入到集合裏面後,該元素經過K個Hash函數運算獲得K個hash後的值,而後將K個值映射到這個位數組對應的位置,把對應位置的值設置爲1。查詢是否存在時,咱們就看對應的映射點位置若是全是1,他就極可能存在(跟hash函數的個數和hash函數的設計有關),若是有一個位置是0,那這個元素就必定不存在。github

Redis 中的布隆過濾器

Redis 官方提供的布隆過濾器到了 Redis 4.0 提供了插件功能以後才正式登場。布隆過濾器做爲一個插件加載到 Redis Server 中,給 Redis 提供了強大的布隆去重功能。redis

你可使用docker鏡像來體驗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 中有兩個值決定布隆過濾器的準確率:bash

  • 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地址去重,解決緩存穿透問題等。

延伸閱讀

本文亦在微信公衆號【小道資訊】發佈,歡迎掃碼關注!

相關文章
相關標籤/搜索