日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Redis?布隆過濾器命令的使用詳解_Redis

作者:寧在春 ? 更新時間: 2022-10-22 編程語言

因為平常使用 Docker 比較多,所以照常還是使用Docker來準備環境啦。

一、Docker 安裝 Redis 布隆過濾器

Redis 本身并不支持布隆過濾器,而是采用插件的方式去安裝的,以達到一種熱拔插的效果。

因為我對于 liunx 來說就是一個小白,所以還是用 docker 香。

我就開始搜索如何為 docker 上的 Redis 安裝布隆過濾器, 實現方式我看了看有好幾種~,但是大都數都需要去下載 redis 布隆過濾器的那個模塊,我覺得這樣也太麻煩了,肯定有前人偷過懶了,果然有更直接的方式~

學習歷史重要原因之一,就是要學會感恩,因為我們都是站在巨人的肩膀上。

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的環境,所以redis未落盤,也未設置密碼,用的也是默認端口,真實要用,不能這么玩,當然也沒這樣玩的

1.2、測試

進入容器中,我們來用redis-cli玩一玩~

docker exec -it [容器名|容器id] bash #/bin/bash 都可
 redis-cli

確定沒啥問題,咱們來玩 Redis 的布隆過濾器

二、RedisBloom 命令講解

2.1、命令大綱

先看看總共有哪些命令,待會咱們一條一條來嘗試,均來自redis官網。

Command Description
BF.ADD 添加一個元素到布隆過濾器
BF.EXISTS 判斷元素是否在布隆過濾器
BF.INFO 返回有關布隆過濾器的信息
BF.INSERT 將多個元素添加到過濾器。如果鍵不存在,它會創建一個新的過濾器。
BF.MADD 添加多個元素到布隆過濾器
BF.MEXISTS 判斷多個元素是否在布隆過濾器
BF.RESERVE 創建一個布隆過濾器。設置誤判率和容量
BF.SCANDUMP 開始增量保存 Bloom 過濾器。
BF.LOADCHUNK 恢復之前使用BF.SCANDUMP保存的布隆過濾器。

2.2、BF.ADD 和 BF.MADD

語法格式:

BF.ADD key value 
 BF.MADD key value1 value2 ...

當key不存在的時候,會創建一個空的布隆過濾器,并會給定一個默認的誤判率和含有上限容量的的子過濾器。并且通過這種方式創建出來的布隆過濾器,是能夠自動縮放的。

每一次擴容,新的子過濾器是用前一個子過濾器的大小來進行擴張,默認擴張倍數為2.

BF.ADD類似于集合的sadd命令,不過bf.add一次只能添加一個元素到集合中。一次性添加多個則使用bf.madd.

2.3、BF.EXISTS 和 BF.MEXISTS

上面也已經用到了,它就是用來判斷元素是否在布隆過濾器中

語法:

bf.exists key value
 bf.mexists key value1 value2 ...

存在返回1,不存在返回0

2.4、BF.INFO

返回有關布隆過濾器的信息,

語法格式:

bf.info key

Capacity #  子過濾器的上限
 (integer) 100
 Size #布隆過濾器的容量大小
 (integer) 296 
 Number of filters  #當前過濾器數量 這里應該是記錄子過濾器數量吧
 (integer) 1
 Number of items inserted # 插入的值的數量
 (integer) 1
 Expansion rate #默認的擴張倍數
 (integer) 2

一個數據看不出來,多插入兩條,看一下對比,大家就明白了

2.5、BF.RESERVE

語法格式:

bf.reserve key error_rate capacity [EXPANSION expansion] [NONSCALING]

使用bf.reserve命令創建一個自定義的布隆過濾器。bf.reserve命令有三個參數,分別是:

key
error_rate
capacity

然后還有兩個可選參數:EXPANSIONNONSCALING

1、EXPANSION:簡單說它就是擴張倍數,省略則默認為2。

如果要存儲在過濾器中的元素數量未知,我們建議您使用expansion2 或更多來減少子過濾器的數量。否則,我們建議您使用expansion1 來減少內存消耗。默認擴展值為 2。

2、NONSCALING:如果寫了這個參數,在達到初始容量,為防止過濾器創建額外的子過濾器。過濾器在達到容量時會返回錯誤capacity,當讓非縮放過濾器比縮放過濾器需要的內存略少。

示例:

bf.reserve nzc:redisboom1 0.01 100
 bf.reserve nzc:redisboom2 0.01 100  EXPANSION 1 
 bf.reserve nzc:redisboom3 0.01 100  NONSCALING

我把相關的信息都打印出來了,大家從所輸出的信息中也能夠看出它們的一些區別。

小結:

  • 如果是預估不到數據的范圍量,而且沒有辦法計算的增長量,那么我覺得暫定為默認的即可。
  • 如果是能夠估算數據的大致范圍,數據增長速度有跡可循,那么可以適當的推算一下EXPANSION這個參數該設置的大小。
  • 如果數據范圍沒有那么那么大,并且可以接受較大程度的誤判率,那么EXPANSION設置為1會更好,能夠節省內存消耗。
  • NONSCALING如果使用此參數,則是將數組大小固定了,需要考慮清楚是否適合。
  • 布隆過濾器的error_rate越小,需要的存儲空間就越大,對于不需要過于精確的場景,error_rate設置稍大一點也可以。布隆過濾器的capacity設置的過大,會浪費存儲空間,設置的過小,就會影響準確率,所以在使用之前一定要盡可能地精確估計好元素數量,還需要加上一定的冗余空間以避免實際元素可能會意外高出設置值很多。總之,error_ratecapacity都需要設置一個合適的數值。

2.6、BF.INSERT

語法格式

BF.INSERT key [CAPACITY capacity] [ERROR error]
   [EXPANSION expansion] [NOCREATE] [NONSCALING] ITEMS item [item...]

由中括號包裹的都是可選參數。大都數參數上面都說到了

NOCREATE指示如果過濾器不存在,則不應創建它。如果過濾器尚不存在,則返回錯誤而不是自動創建它。這可以用于過濾器創建和過濾器添加之間需要嚴格分離的地方。

示例:

BF.INSERT nzc:redisboom4  items key1 key2 key3

補充:

BF.SCANDUMP # 開始布隆過濾器的增量保存。這對于無法適應法線DUMP和RESTORE模型的大型布隆過濾器很有用。
 BF.LOADCHUNK  #恢復以前使用保存的過濾器SCANDUMP。

原文鏈接:https://juejin.cn/post/7135840044547309598

欄目分類
最近更新