系列文章html
布隆过滤器能够理解为一个不怎么精确的 set 结构,当你使用它的 contains 方法判断某个对象是否存在时,它可能会误判。可是布隆过滤器也不是特别不精确,只要参数设置的合理,它的精确度能够控制的相对足够精确,只会有小小的误判几率。当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就确定不存在。git
其本质就是一个只包含0和1的数组。具体操做当一个元素被加入到集合里面后,该元素经过K个Hash函数运算获得K个hash后的值,而后将K个值映射到这个位数组对应的位置,把对应位置的值设置为1。查询是否存在时,咱们就看对应的映射点位置若是全是1,他就极可能存在(跟hash函数的个数和hash函数的设计有关),若是有一个位置是0,那这个元素就必定不存在。github
Redis 官方提供的布隆过滤器到了 Redis 4.0 提供了插件功能以后才正式登场。布隆过滤器做为一个插件加载到 Redis Server 中,给 Redis 提供了强大的布隆去重功能。redis
你可使用docker镜像来体验docker
> docker pull redislabs/rebloom # 拉取镜像
> docker run -p6379:6379 redislabs/rebloom # 运行容器
> redis-cli # 链接容器中的 redis 服务
复制代码
固然你也能够本身编译安装数组
下载编译安装Rebloom插件
wget https://github.com/RedisLabsModules/rebloom/archive/v1.1.1.tar.gz
解压 tar zxvf v1.1.1.tar.gz
cd rebloom-1.1.1
make
redis服启动添加对应参数
rebloom_module="/usr/local/rebloom/rebloom.so"
daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG --loadmodule $rebloom_module --daemonize yes --pidfile $pidfile"
重启redis服务
测试命令
bf.add test testValue
命令成功说明开启成功
复制代码
主要命令有缓存
在 redis 中有两个值决定布隆过滤器的准确率:bash
redis 中有一个命令能够来设置这两个值:微信
bf.reserve test 0.01 100
复制代码
注意必须在add以前使用bf.reserve指令显式建立,若是对应的 key 已经存在,bf.reserve会报错。同时设置的错误率越低,须要的空间越大。若是不使用 bf.reserve,默认的error_rate是 0.01,默认的initial_size是 100。异步
主要是解决大规模数据下不须要精确过滤的场景,如检查垃圾邮件地址,爬虫URL地址去重,解决缓存穿透问题等。
本文亦在微信公众号【小道资讯】发布,欢迎扫码关注!