系列文章html
布隆過濾器能夠理解爲一個不怎麼精確的 set 結構,當你使用它的 contains 方法判斷某個對象是否存在時,它可能會誤判。可是布隆過濾器也不是特別不精確,只要參數設置的合理,它的精確度能夠控制的相對足夠精確,只會有小小的誤判機率。當布隆過濾器說某個值存在時,這個值可能不存在;當它說不存在時,那就確定不存在。git
其本質就是一個只包含0和1的數組。具體操做當一個元素被加入到集合裏面後,該元素經過K個Hash函數運算獲得K個hash後的值,而後將K個值映射到這個位數組對應的位置,把對應位置的值設置爲1。查詢是否存在時,咱們就看對應的映射點位置若是全是1,他就極可能存在(跟hash函數的個數和hash函數的設計有關),若是有一個位置是0,那這個元素就必定不存在。github
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
命令成功說明開啓成功
複製代碼
主要命令有緩存
在 redis 中有兩個值決定布隆過濾器的準確率:bash
redis 中有一個命令能夠來設置這兩個值:微信
bf.reserve test 0.01 100
複製代碼
注意必須在add以前使用bf.reserve指令顯式建立,若是對應的 key 已經存在,bf.reserve會報錯。同時設置的錯誤率越低,須要的空間越大。若是不使用 bf.reserve,默認的error_rate是 0.01,默認的initial_size是 100。異步
主要是解決大規模數據下不須要精確過濾的場景,如檢查垃圾郵件地址,爬蟲URL地址去重,解決緩存穿透問題等。
本文亦在微信公衆號【小道資訊】發佈,歡迎掃碼關注!