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