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正常。