Redis應(yīng)用-布隆過濾器

系列文章

布隆過濾器是什么?

布隆過濾器可以理解為一個(gè)不怎么精確的 set 結(jié)構(gòu),當(dāng)你使用它的 contains 方法判斷某個(gè)對象是否存在時(shí),它可能會(huì)誤判。但是布隆過濾器也不是特別不精確,只要參數(shù)設(shè)置的合理,它的精確度可以控制的相對足夠精確,只會(huì)有小小的誤判概率。

當(dāng)布隆過濾器說某個(gè)值存在時(shí),這個(gè)值可能不存在;當(dāng)它說不存在時(shí),那就肯定不存在。打個(gè)比方,當(dāng)它說不認(rèn)識你時(shí),肯定就不認(rèn)識;當(dāng)它說見過你時(shí),可能根本就沒見過面,不過因?yàn)槟愕哪樃J(rèn)識的人中某臉比較相似 (某些熟臉的系數(shù)組合),所以誤判以前見過你。
套在上面的使用場景中,布隆過濾器能準(zhǔn)確過濾掉那些已經(jīng)看過的內(nèi)容,那些沒有看過的新內(nèi)容,它也會(huì)過濾掉極小一部分 (誤判),但是絕大多數(shù)新內(nèi)容它都能準(zhǔn)確識別。這樣就可以完全保證推薦給用戶的內(nèi)容都是無重復(fù)的。

布隆過濾器的原理

其本質(zhì)就是一個(gè)只包含0和1的數(shù)組。具體操作當(dāng)一個(gè)元素被加入到集合里面后,該元素通過K個(gè)Hash函數(shù)運(yùn)算得到K個(gè)hash后的值,然后將K個(gè)值映射到這個(gè)位數(shù)組對應(yīng)的位置,把對應(yīng)位置的值設(shè)置為1。查詢是否存在時(shí),我們就看對應(yīng)的映射點(diǎn)位置如果全是1,他就很可能存在(跟hash函數(shù)的個(gè)數(shù)和hash函數(shù)的設(shè)計(jì)有關(guān)),如果有一個(gè)位置是0,那這個(gè)元素就一定不存在。

Redis 中的布隆過濾器

Redis 官方提供的布隆過濾器到了 Redis 4.0 提供了插件功能之后才正式登場。布隆過濾器作為一個(gè)插件加載到 Redis Server 中,給 Redis 提供了強(qiáng)大的布隆去重功能。

你可以使用docker鏡像來體驗(yàn)

> docker pull redislabs/rebloom # 拉取鏡像
> docker run -p6379:6379 redislabs/rebloom # 運(yùn)行容器
> redis-cli # 連接容器中的 redis 服務(wù)

當(dāng)然你也可以自己編譯安裝

下載編譯安裝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服啟動(dòng)添加對應(yīng)參數(shù)
rebloom_module="/usr/local/rebloom/rebloom.so"
daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG --loadmodule $rebloom_module --daemonize yes --pidfile $pidfile"

重啟redis服務(wù)

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

布隆過濾器基本使用

主要命令有

  • bf.add 添加元素
  • bf.exists 查詢元素是否存在
  • bf.madd 一次添加多個(gè)元素
  • bf.mexists 一次查詢多個(gè)元素是否存在

在 redis 中有兩個(gè)值決定布隆過濾器的準(zhǔn)確率:

  • error_rate:允許布隆過濾器的錯(cuò)誤率,這個(gè)值越低過濾器的位數(shù)組的大小越大,占用空間也就越大。
  • initial_size:布隆過濾器可以儲(chǔ)存的元素個(gè)數(shù),當(dāng)實(shí)際存儲(chǔ)的元素個(gè)數(shù)超過這個(gè)值之后,過濾器的準(zhǔn)確率會(huì)下降。

redis 中有一個(gè)命令可以來設(shè)置這兩個(gè)值:

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

注意必須在add之前使用bf.reserve指令顯式創(chuàng)建,如果對應(yīng)的 key 已經(jīng)存在,bf.reserve會(huì)報(bào)錯(cuò)。同時(shí)設(shè)置的錯(cuò)誤率越低,需要的空間越大。如果不使用 bf.reserve,默認(rèn)的error_rate是 0.01,默認(rèn)的initial_size是 100。

應(yīng)用場景

主要是解決大規(guī)模數(shù)據(jù)下不需要精確過濾的場景,如檢查垃圾郵件地址,爬蟲URL地址去重,解決緩存穿透問題等。

延伸閱讀

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

本文亦在微信公眾號【小道資訊】發(fā)布,歡迎掃碼關(guān)注!


image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 使用 HyperLogLog 數(shù)據(jù)結(jié)構(gòu)來進(jìn)行估數(shù),它非常有價(jià)值,可以解決很多精確度不高的統(tǒng)計(jì)需求。 但是如果我們想...
    要不再等等閱讀 1,105評論 0 1
  • 一、什么是布隆過濾器? 布隆過濾器可以用來判斷一個(gè)元素是否在一個(gè)集合中。它的優(yōu)勢是只需要占用很小的內(nèi)存空間以及有著...
    王知無閱讀 1,488評論 1 8
  • 上一節(jié)我們學(xué)會(huì)了使用 HyperLogLog 數(shù)據(jù)結(jié)構(gòu)來進(jìn)行估數(shù),它非常有價(jià)值,可以解決多精確度不高的統(tǒng)計(jì)需求。 ...
    天的安排閱讀 793評論 0 0
  • 引言 我們知道檢查一個(gè)元素是否在某一個(gè)集合中,使用HashSet是比較好的選擇,因?yàn)樵诓话l(fā)生Hash碰撞的情況下它...
    不知名的程序員閱讀 7,577評論 0 8
  • 拿今日頭條來說,它會(huì)不停的給我們推薦新的新聞,每次推薦都要去重,過濾掉我們之前看過的內(nèi)容,今日頭條如何做到去重呢,...
    773eeb0e0c48閱讀 480評論 0 1

友情鏈接更多精彩內(nèi)容