Redis?布隆過濾器命令的使用詳解
因為平常使用 Docker 比較多,所以照常還是使用Docker來準(zhǔn)備環(huán)境啦。
一、Docker 安裝 Redis 布隆過濾器
Redis 本身并不支持布隆過濾器,而是采用插件的方式去安裝的,以達(dá)到一種熱拔插的效果。
因為我對于 liunx 來說就是一個小白,所以還是用 docker 香。
我就開始搜索如何為 docker 上的 Redis 安裝布隆過濾器, 實現(xiàn)方式我看了看有好幾種~,但是大都數(shù)都需要去下載 redis 布隆過濾器的那個模塊,我覺得這樣也太麻煩了,肯定有前人偷過懶了,果然有更直接的方式~
學(xué)習(xí)歷史重要原因之一,就是要學(xué)會感恩,因為我們都是站在巨人的肩膀上。
Docker 上有個redislabs/rebloom的鏡像,它是將redis和布隆過濾器打包在一起的一個鏡像,直接使用這個鏡像啟動的redis容器,直接就可以使用布隆過濾器~:woman::computer:
1.1、安裝
搜索鏡像
docker search redislabs/rebloom

拉取鏡像
docker pull redislabs/rebloom

啟動鏡像
docker run -d -p 6379:6379 --name myrebloom redislabs/rebloom

注意:
我只是為了有個寫demo的環(huán)境,所以redis未落盤,也未設(shè)置密碼,用的也是默認(rèn)端口,真實要用,不能這么玩,當(dāng)然也沒這樣玩的。
1.2、測試
進入容器中,我們來用redis-cli玩一玩~
docker exec -it [容器名|容器id] bash #/bin/bash 都可 redis-cli


確定沒啥問題,咱們來玩 Redis 的布隆過濾器
二、RedisBloom 命令講解
2.1、命令大綱
先看看總共有哪些命令,待會咱們一條一條來嘗試,均來自redis官網(wǎng)。
| Command | Description |
|---|---|
| BF.ADD | 添加一個元素到布隆過濾器 |
| BF.EXISTS | 判斷元素是否在布隆過濾器 |
| BF.INFO | 返回有關(guān)布隆過濾器的信息 |
| BF.INSERT | 將多個元素添加到過濾器。如果鍵不存在,它會創(chuàng)建一個新的過濾器。 |
| BF.MADD | 添加多個元素到布隆過濾器 |
| BF.MEXISTS | 判斷多個元素是否在布隆過濾器 |
| BF.RESERVE | 創(chuàng)建一個布隆過濾器。設(shè)置誤判率和容量 |
| BF.SCANDUMP | 開始增量保存 Bloom 過濾器。 |
| BF.LOADCHUNK | 恢復(fù)之前使用BF.SCANDUMP保存的布隆過濾器。 |
2.2、BF.ADD 和 BF.MADD
語法格式:
BF.ADD key value BF.MADD key value1 value2 ...
當(dāng)key不存在的時候,會創(chuàng)建一個空的布隆過濾器,并會給定一個默認(rèn)的誤判率和含有上限容量的的子過濾器。并且通過這種方式創(chuàng)建出來的布隆過濾器,是能夠自動縮放的。
每一次擴容,新的子過濾器是用前一個子過濾器的大小來進行擴張,默認(rèn)擴張倍數(shù)為2.
BF.ADD類似于集合的sadd命令,不過bf.add一次只能添加一個元素到集合中。一次性添加多個則使用bf.madd.

2.3、BF.EXISTS 和 BF.MEXISTS
上面也已經(jīng)用到了,它就是用來判斷元素是否在布隆過濾器中
語法:
bf.exists key value bf.mexists key value1 value2 ...
存在返回1,不存在返回0

2.4、BF.INFO
返回有關(guān)布隆過濾器的信息,
語法格式:
bf.info key

Capacity # 子過濾器的上限 (integer) 100 Size #布隆過濾器的容量大小 (integer) 296 Number of filters #當(dāng)前過濾器數(shù)量 這里應(yīng)該是記錄子過濾器數(shù)量吧 (integer) 1 Number of items inserted # 插入的值的數(shù)量 (integer) 1 Expansion rate #默認(rèn)的擴張倍數(shù) (integer) 2
一個數(shù)據(jù)看不出來,多插入兩條,看一下對比,大家就明白了

2.5、BF.RESERVE
語法格式:
bf.reserve key error_rate capacity [EXPANSION expansion] [NONSCALING]
使用bf.reserve命令創(chuàng)建一個自定義的布隆過濾器。bf.reserve命令有三個參數(shù),分別是:
key error_rate capacity
然后還有兩個可選參數(shù):EXPANSION和NONSCALING
1、EXPANSION:簡單說它就是擴張倍數(shù),省略則默認(rèn)為2。
如果要存儲在過濾器中的元素數(shù)量未知,我們建議您使用expansion2 或更多來減少子過濾器的數(shù)量。否則,我們建議您使用expansion1 來減少內(nèi)存消耗。默認(rèn)擴展值為 2。
2、NONSCALING:如果寫了這個參數(shù),在達(dá)到初始容量,為防止過濾器創(chuàng)建額外的子過濾器。過濾器在達(dá)到容量時會返回錯誤capacity,當(dāng)讓非縮放過濾器比縮放過濾器需要的內(nèi)存略少。
示例:
bf.reserve nzc:redisboom1 0.01 100 bf.reserve nzc:redisboom2 0.01 100 EXPANSION 1 bf.reserve nzc:redisboom3 0.01 100 NONSCALING
我把相關(guān)的信息都打印出來了,大家從所輸出的信息中也能夠看出它們的一些區(qū)別。



小結(jié):
- 如果是預(yù)估不到數(shù)據(jù)的范圍量,而且沒有辦法計算的增長量,那么我覺得暫定為默認(rèn)的即可。
- 如果是能夠估算數(shù)據(jù)的大致范圍,數(shù)據(jù)增長速度有跡可循,那么可以適當(dāng)?shù)耐扑阋幌?code>EXPANSION這個參數(shù)該設(shè)置的大小。
- 如果數(shù)據(jù)范圍沒有那么那么大,并且可以接受較大程度的誤判率,那么
EXPANSION設(shè)置為1會更好,能夠節(jié)省內(nèi)存消耗。 NONSCALING如果使用此參數(shù),則是將數(shù)組大小固定了,需要考慮清楚是否適合。- 布隆過濾器的
error_rate越小,需要的存儲空間就越大,對于不需要過于精確的場景,error_rate設(shè)置稍大一點也可以。布隆過濾器的capacity設(shè)置的過大,會浪費存儲空間,設(shè)置的過小,就會影響準(zhǔn)確率,所以在使用之前一定要盡可能地精確估計好元素數(shù)量,還需要加上一定的冗余空間以避免實際元素可能會意外高出設(shè)置值很多??傊?code>error_rate和capacity都需要設(shè)置一個合適的數(shù)值。
2.6、BF.INSERT
語法格式
BF.INSERT key [CAPACITY capacity] [ERROR error] [EXPANSION expansion] [NOCREATE] [NONSCALING] ITEMS item [item...]
由中括號包裹的都是可選參數(shù)。大都數(shù)參數(shù)上面都說到了
NOCREATE指示如果過濾器不存在,則不應(yīng)創(chuàng)建它。如果過濾器尚不存在,則返回錯誤而不是自動創(chuàng)建它。這可以用于過濾器創(chuàng)建和過濾器添加之間需要嚴(yán)格分離的地方。
示例:
BF.INSERT nzc:redisboom4 items key1 key2 key3

補充:
BF.SCANDUMP # 開始布隆過濾器的增量保存。這對于無法適應(yīng)法線DUMP和RESTORE模型的大型布隆過濾器很有用。 BF.LOADCHUNK #恢復(fù)以前使用保存的過濾器SCANDUMP。
到此這篇關(guān)于Redis布隆過濾器的相關(guān)命令的使用的文章就介紹到這了,更多相關(guān)Redis布隆過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redis通過redis-dump鏡像實現(xiàn)數(shù)據(jù)遷移
本文主要介紹了redis通過redis-dump鏡像實現(xiàn)數(shù)據(jù)遷移,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
Redis高效查詢大數(shù)據(jù)的實踐與優(yōu)化詳細(xì)指南
Redis 是一種高性能的鍵值存儲數(shù)據(jù)庫,廣泛應(yīng)用于緩存,排行榜,計數(shù)器等場景,本文將圍繞如何高效查詢Redis中滿足條件的數(shù)據(jù)展開討論,感興趣的小伙伴可以了解下2025-04-04
RedisDesktopManager無法遠(yuǎn)程連接Redis的完美解決方法
下載RedisDesktopManager客戶端,輸入服務(wù)器IP地址,端口(缺省值:6379);點擊Test Connection按鈕測試連接,連接失敗,怎么回事呢?下面小編給大家?guī)砹薘edisDesktopManager無法遠(yuǎn)程連接Redis的完美解決方法,一起看看吧2018-03-03

