RedisBloom模塊提供了四種數據類型:Bloom Filter and Cuckoo Filter , a Count-Mins-Sketch and a Top-K 。 本文介紹前兩種過濾器的使用,Count-Mins-Sketch and Top-K 可參考官網用法:https://oss.redislabs.com/redisbloom
Bloom Filte 與 Cuckoo Filter 的對比:
時下一個非常流行的哈希索引結構就是bloom filter,它類似於bitmap這樣的hashset,所以能夠在 O(1) 的時間復雜度下快速確認該物品有沒有存在。但是它有幾個問題:
-
- 可能存在誤報
- 無法刪除元素
- 無法阻止插入(無法判斷容器是否已滿)
而cuckoo filter則可以解決這些問題。它的優勢在於:
-
- 支援動態的新增,刪除節點
- 當整個結構接近使用完畢的時候, Cuckoo Filter 具有更好的 Lookup 效能
- 具有 False Positive Rate 比 Bloom Filter 更小 (< 3%) 並且具有更少的空間使用
一、安裝RedisBloom
1、下載RedisBloom模塊
1、git 下載
git clone https://github.com/RedisBloom/RedisBloom.git
cd redisbloom
make
2、wget 下載
wget https://github.com/RedisBloom/RedisBloom/archive/v2.0.3.tar.gz
tar -zxvf RedisBloom-2.0.3.tar.gz
cd RedisBloom-2.0.3/
make
2、修改Redis Conf
[root@emunshe ~]#vim /etc/redis.conf
# 在文件中添加下行
loadmodule /root/RedisBloom-2.0.3/redisbloom.so
3、啟動Redis server
[root@emunshe ~]# /redis-server /etc/redis.conf
或者啟動服務時加載os文件
[root@emunshe ~]# /redis-server /etc/redis.conf --loadmodule /root/RedisBloom/redisbloom.so
4、測試RedisBloom
[root@emunshe ~]# redis-cli
127.0.0.1:6379> bf.add bloomFilter foo
127.0.0.1:6379> bf.exists bloomFilter foo
127.0.0.1:6379> cf.add cuckooFilter foo
127.0.0.1:6379> cf.exists cuckooFilter foo
二、python使用RedisBloom
1、安裝
$ pip install redisbloom
2、使用示例
# Using Bloom Filter from redisbloom.client import Client rb = Client() rb.bfCreate('bloom', 0.01, 1000) rb.bfAdd('bloom', 'foo') # returns 1 rb.bfAdd('bloom', 'foo') # returns 0 rb.bfExists('bloom', 'foo') # returns 1 rb.bfExists('bloom', 'noexist') # returns 0 # Using Cuckoo Filter from redisbloom.client import Client rb = Client() rb.cfCreate('cuckoo', 1000) rb.cfAdd('cuckoo', 'filter') # returns 1 rb.cfAddNX('cuckoo', 'filter') # returns 0 rb.cfExists('cuckoo', 'filter') # returns 1 rb.cfExists('cuckoo', 'noexist') # returns 0
三、問題記錄
在添加redisbloom os 模塊后啟動Redis server,使用 systemctl start redis 啟動報錯;使用redis-server redis.conf正常。