網站首頁 編程語言 正文
因為平常使用 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
然后還有兩個可選參數:EXPANSION
和NONSCALING
1、EXPANSION
:簡單說它就是擴張倍數,省略則默認為2。
如果要存儲在過濾器中的元素數量未知,我們建議您使用expansion
2 或更多來減少子過濾器的數量。否則,我們建議您使用expansion
1 來減少內存消耗。默認擴展值為 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_rate
和capacity
都需要設置一個合適的數值。
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
相關推薦
- 2023-12-13 idea git只查看某個人提交的代碼記錄
- 2023-02-17 python連接讀寫操作redis的完整代碼實例_python
- 2022-09-14 Redis?緩存淘汰策略和事務實現樂觀鎖詳情_Redis
- 2022-10-14 linux【centos 7】 yum 安裝 tesseract 4.1
- 2022-12-12 Docker制作tomcat鏡像并部署項目_docker
- 2022-04-11 Tomcat訪問不到web應用報錯ORA-01882: 未找到時區的解決方案
- 2023-07-16 spring boot 實現token攔截
- 2022-02-21 el-table-column的formatter的使用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支