redis添加布隆過濾器插件

redis添加布隆過濾器插件

概念

布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都比一般的算法要好的多,缺點是有一定的誤識別率和刪除困難。

redis在4.0版本以後可通過插件的形式添加布隆過濾器

 

編譯安裝

到redis安裝目錄創建module目錄

cd /opt/server/redis
mkdir module && cd module

git clone代碼

yum -y install git
git clone https://github.com/RedisLabsModules/redisbloom.git

編譯

cd redisbloom
make

編譯後得到動態庫redisbloom.so

Redis引入該模塊

  • (1)在redis.conf配置文件里加入如下引入配置
loadmodule ../module/redisbloom/redisbloom.so
  • (2)redis集羣每個配置文件都需要加入這一行
  • (3)添加完配置後重啓redis

 

布隆過濾器基本使用

redis 布隆過濾器主要就兩個命令:

  • bf.add 添加元素到布隆過濾器中:bf.add urls https://jaychen.cc
  • bf.exists 判斷某個元素是否在過濾器中:bf.exists urls https://jaychen.cc

上面說過布隆過濾器存在誤判的情況,在 redis 中有兩個值決定布隆過濾器的準確率:

  • error_rate:允許布隆過濾器的錯誤率,這個值越低過濾器的位數組的大小越大,佔用空間也就越大。
  • initial_size:布隆過濾器可以儲存的元素個數,當實際存儲的元素個數超過這個值之後,過濾器的準確率會下降。

redis 中有一個命令可以來設置這兩個值:

bf.reserve urls 0.01 100

三個參數的含義:

  • 第一個值是過濾器的名字。

  • 第二個值爲 error_rate 的值。

  • 第三個值爲 initial_size 的值。

    如果不使用 bf.reserve,默認的error_rate是 0.01,默認的initial_size是 100。

127.0.0.1:6379> bf.add user:bf 1001
(integer) 1
127.0.0.1:6379> bf.add user:bf 1002
(integer) 1
127.0.0.1:6379> bf.add user:bf 1003
(integer) 1
127.0.0.1:6379> bf.exists user:bf 1001
(integer) 1
127.0.0.1:6379> bf.exists user:bf 1002
(integer) 1
127.0.0.1:6379> bf.exists user:bf 1003
(integer) 1
127.0.0.1:6379> bf.exists user:bf 1004
(integer) 0
127.0.0.1:6379> bf.madd user:bf 1004 1005 1006
1) (integer) 1
2) (integer) 1
3) (integer) 1
127.0.0.1:6379> bf.mexists user:bf 1004 1005 1006 1007
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 0
127.0.0.1:6379>

 

注意事項

布隆過濾器的initial_size估計的過大,會浪費存儲空間,估計的過小,就會影響準確率,用戶在使用之前一定要儘可能地精確估計好元素數量,還需要加上一定的冗餘空間以避免實際元素可能會意外高出估計值很多。

布隆過濾器的error_rate越小,需要的存儲空間就越大,對於不需要過於精確的場合,error_rate設置稍大一點也無傷大雅。比如在新聞去重上而言,誤判率高一點只會讓小部分文章不能讓合適的人看到,文章的整體閱讀量不會因爲這點誤判率就帶來巨大的改變。

 

布隆過濾器的其它應用

在爬蟲系統中,我們需要對 URL 進行去重,已經爬過的網頁就可以不用爬了。但是 URL 太多了,幾千萬幾個億,如果用一個集合裝下這些 URL 地址那是非常浪費空間的。這時候就可以考慮使用布隆過濾器。它可以大幅降低去重存儲消耗,只不過也會使得爬蟲系統錯過少量的頁面。

布隆過濾器在 NoSQL 數據庫領域使用非常廣泛,我們平時用到的 HBase、Cassandra 還有 LevelDB、RocksDB 內部都有布隆過濾器結構,布隆過濾器可以顯著降低數據庫的 IO 請求數量。當用戶來查詢某個 row 時,可以先通過內存中的布隆過濾器過濾掉大量不存在的 row 請求,然後再去磁盤進行查詢。

郵箱系統的垃圾郵件過濾功能也普遍用到了布隆過濾器,因爲用了這個過濾器,所以平時也會遇到某些正常的郵件被放進了垃圾郵件目錄中,這個就是誤判所致,概率很低。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章