:::info
redis实现布隆过滤器是基于bitmap实现的,bitmap:Bitmap详解
布隆过滤器的原理:布隆过滤器(BloomFilter)
:::
Redisbloom
github:https://github.com/RedisBloom/RedisBloom
官方文档:https://oss.redislabs.com/redisbloom/
安装Redisbloom插件
下载
[root@redis-master redis-6.2.4]# mkdir module & cd module
[root@redis-master module]# wget https://github.com/RedisBloom/RedisBloom/archive/v2.2.4.tar.gz
[root@redis-master module]# tar xzvf v2.2.4.tar.gz
编译
[root@redis-master module]# cd RedisBloom-2.2.4/
[root@redis-master RedisBloom-2.2.4]# make
# 此时该目录下生成了一个redisbloom.so
# 复制一下当前目录,一会配置要用
[root@redis-master RedisBloom-2.2.4]# pwd
/usr/local/redis-6.2.4/module/RedisBloom-2.2.4
配置
[root@redis-master RedisBloom-2.2.4]# cd ../..
[root@redis-master redis-6.2.4]# vim redis.conf
################################## MODULES #####################################
# Load modules at startup. If the server is not able to load modules
# it will abort. It is possible to use multiple loadmodule directives.
# 在module下添加加载模块配置,这里的路径是刚才安装的redisbloom.so的路径。
loadmodule /usr/local/redis-6.2.4/module/RedisBloom-2.2.4/redisbloom.so
或者也可以不用配置,直接在启动参数加上redisboom.so的路径也可。
重启redis
[root@redis-master src]# ./redis-server ../redis.conf
连接redis-cli开始测试
[root@redis-master src]# redis-cli -a anin
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379>
添加
如果尚不存在,则会为您创建一个新过滤器
127.0.0.1:6379> bf.add f2 zhangsan
(integer) 1
检索过滤器
127.0.0.1:6379> bf.exists f2 zhangsan
(integer) 1
127.0.0.1:6379> bf.exists f2 lisi
(integer) 0
添加和检查多个项目
127.0.0.1:6379> bf.madd f2 lisi wangwu maliu
1) (integer) 1
2) (integer) 1
3) (integer) 1
127.0.0.1:6379> bf.mexists f2 lisi wangwu maliu tianqi
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 0
上面的例子中使用的布隆过滤器只是默认参数的布隆过滤器,它在我们第一次使用bf.add
命令时自动创建的。Redis还提供了自定义参数的布隆过滤器,想要尽量减少布隆过滤器的误判,就要设置合理的参数。
在使用bf.add
命令添加元素之前,使用bf.reserve
命令创建一个自定义的布隆过滤器。bf.reserve
命令有三个参数,分别是:
key
:键error_rate
:期望错误率,期望错误率越低,需要的空间就越大。capacity
:初始容量,当实际元素的数量超过这个初始化容量时,误判率上升。
如果对应的key已经存在时,在执行127.0.0.1:6379> bf.reserve f3 0.0001 1000000
OK
bf.reserve
命令就会报错。如果不使用bf.reserve
命令创建,而是使用Redis自动创建的布隆过滤器,默认的error_rate
是 0.01,capacity
是 100。
布隆过滤器的error_rate
越小,需要的存储空间就越大,对于不需要过于精确的场景,error_rate
设置稍大一点也可以。布隆过滤器的capacity
设置的过大,会浪费存储空间,设置的过小,就会影响准确率,所以在使用之前一定要尽可能地精确估计好元素数量,还需要加上一定的冗余空间以避免实际元素可能会意外高出设置值很多。总之,error_rate
和capacity
都需要设置一个合适的数值。