赞
踩
exists()
来判断某个元素是否存在于自身结构中。当布隆过滤器判定某个值存在时,其实这个值只是有可能存在;当它说某个值不存在时,那这个值肯定不存在,这个误判概率大约在 1% 左右。docker pull redislabs/rebloom:latest
docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest
docker exec -it redis-redisbloom bash
redis-cli
#测试是否安装成功
127.0.0.1:6379> bf.add u1:name tony
(integer) 1
#将下载下的RedisBloom利用Xftp工具上传到/usr/local/src目录,本版本使用RedisBloom-2.2.9.zip,新版本有可能存在问题。 [root@VM-0-3-centos ~]# cd /usr/local/src [root@VM-0-3-centos src]# unzip RedisBloom-2.2.9.zip #进入解压目录 [root@VM-0-3-centos src]# cd /usr/local/src/RedisBloom-2.2.9 执行编译命令,生成redisbloom.so 文件: make [root@VM-0-3-centos RedisBloom-2.2.9]# ll total 424 drwxr-xr-x 3 root root 4096 Nov 8 2021 build -rw-r--r-- 1 root root 211 Nov 8 2021 changelog -rw-r--r-- 1 root root 520 Nov 8 2021 codecov.yml drwxr-xr-x 2 root root 4096 Dec 7 17:33 contrib -rw-r--r-- 1 root root 431 Nov 8 2021 Dockerfile drwxr-xr-x 3 root root 4096 Nov 8 2021 docs -rw-r--r-- 1 root root 5789 Nov 8 2021 LICENSE -rw-r--r-- 1 root root 3310 Nov 8 2021 Makefile -rw-r--r-- 1 root root 1464 Nov 8 2021 mkdocs.yml drwxr-xr-x 3 root root 4096 Nov 8 2021 opt -rw-r--r-- 1 root root 538 Nov 8 2021 ramp.yml -rw-r--r-- 1 root root 4658 Nov 8 2021 README.md -rwxr-xr-x 1 root root 359160 Dec 7 17:33 redisbloom.so drwxr-xr-x 2 root root 4096 Dec 7 17:33 rmutil drwxr-xr-x 2 root root 4096 Dec 7 17:33 src -rwxr-xr-x 1 root root 2092 Nov 8 2021 system-setup.py drwxr-xr-x 3 root root 4096 Nov 8 2021 tests #将make后生成的redisbloom.so文件拷贝至redis指定目录: [root@VM-0-3-centos RedisBloom-2.2.9]# cp redisbloom.so /usr/local/redis/bin/redisbloom.so [root@localhost RedisBloom-2.2.9]# cd /usr/local/redis/conf [root@localhost conf]# vim redis.conf #在redis配置文件redis.conf里配置加载该模块: loadmodule /usr/local/redis/bin/redisbloom.so #先关闭redis服务 [root@VM-0-3-centos conf]# redis-cli -a xxxxx Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> shutdown not connected> exit #然后在启动redis服务端,注意redis配置文件的路径 [root@VM-0-3-centos conf]# redis-server redis.conf #或者使用如下命令启动,要在安装的时候将启动文件加到/etc/init.d/ #sudo /etc/init.d/redis-server start #测试是否安装成功 127.0.0.1:6379> bf.add u1:name tony (integer) 1
出现问题:在使用RedisBloom-2.4.3新版本进行编译时,出现/rules文件找不到问题,出现在编译文件Makefile:224行,说明系统环境不允许安装新版本的RedisBloom,那就将版本降一些。
[root@VM-0-3-centos src]# cd RedisBloom-2.4.3
[root@VM-0-3-centos RedisBloom-2.4.3]# make
Makefile:224: /rules: No such file or directory
make: *** No rule to make target ‘/rules’. Stop.解决方法:使用RedisBloom-2.2.9.zip版本即可
命令 | 说明 |
---|---|
bf.add | 只能添加元素到布隆过滤器。 |
bf.exists | 判断某个元素是否在于布隆过滤器中。 |
bf.madd | 同时添加多个元素到布隆过滤器。 |
bf.mexists | 同时判断多个元素是否存在于布隆过滤器中。 |
bf.reserve | 以自定义的方式设置布隆过滤器参数值,共有 3 个参数分别是 key、error_rate(错误率)、initial_size(初始大小)。 |
#添加元素于布隆过滤器中。 127.0.0.1:6379> bf.add u1:name tony (integer) 1 #验证是否在于布隆过滤器中。 remote:0>bf.exists u1:name tony "1" #添加多个元素到布隆过滤器,同用一个key。 remote:0>bf.madd us:name zs ls ww 1) "1" 2) "1" 3) "1" #判断多个元素是否存在于布隆过滤器中。 remote:0>bf.mexists us:name zs ww 1) "1" 2) "1" #不在布隆过滤器中的元素返回0 remote:0>bf.mexists us:name zs wws 1) "1" 2) "0"
import redis
size=10000
r = redis.Redis()
count = 0
for i in range(size):
#添加元素,key为userid,值为user0...user9999
r.execute_command("bf.add", "userid", "user%d" % i)
#判断元素是否存在,此处切记 i+1
res = r.execute_command("bf.exists", "userid", "user%d" % (i + 1))
if res == 1:
print(i)
count += 1
#求误判率,round()中的5表示保留的小数点位数
print("size: {} ,error rate:{}%".format(size, round(count / size * 100, 5)))
size: 1000 , error rate: 1.0%
size: 10000 , error rate: 1.25%
size: 100000 , error rate: 1.305%
通过上述结果可以看出布隆过滤器的错误率为 1% 多点,当 size 越来越大时,布隆过滤器的错误率就会升高,那么有没有办法降低错误率呢?这就用到了布隆过滤器提供的bf.reserve
方法。如果不使用该方法设置参数,那么布隆过滤器将按照默认参数进行设置,如下所示:
当放入过滤器中的元素数量超过了 initial_size 值时,错误率 error_rate 就会升高。因此就需要设置一个较大 initial_size 值,避免因数量超出导致的错误率上升。
**解决错误率过高的问题:**错误率越低,所需要的空间也会越大,因此就需要我们尽可能精确的估算元素数量,避免空间的浪费。我们也要根据具体的业务来确定错误率的许可范围,对于不需要太精确的业务场景,错误率稍微设置大一点也可以。
注意:如果要使用自定义的布隆过滤器需要在 add 操作之前,使用 bf.reserve 命令显式地创建 key,格式如下:
client.execute_command("bf.reserve", "keyname", 0.001, 50000)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。