前言
本文讲述布隆过滤器 (RedisBloom) 的基本原理和安装使用。
RedisBloom是什么?
RedisBloom 是 Redis 中过滤器模块,可以用来判断值是否存在,常用来解决缓存穿透问题。
查询数据时,先用 RedisBloom 判断数据是否存在,不存在则直接返回,存在则从缓存 / 数据库获取后返回。
比如查询接口,可以将数据库能查出数据的条件值先添加到过滤器中,后续请求接口前先用过滤器进行判断,如果不存在代表查不出数据直接返回,这样减少后续业务压力。
又比如给用户推荐内容的时候,用户看过的可以添加到过滤器中,后续推荐时进行过滤,保证推送给用户的内容不重复。
Set 其实也可以实现过滤,缺点要占用大量内存,因为要保存完整 value 数据。
而 RedisBloom 则是利用 BitMap 来保存 value。添加的时候每个 value 都经过 n 个 hash 算法对 BitMap 取模算出位置置为 1,这样一个 value 会使多个位置为 1;判断是否存在的时候 value 同样经过 n 个 hash 算法取模算出多个位置,所有位置为 1 则代表 value 存在。

基于这种方式它会具有如下特点:
-
• EXISTS 判断出 value 不存在,那 value 一定不存在。
-
• EXISTS 判断出 value 存在,那 value 不一定存在。因为不同的 value 算出的位置有可能重叠,这个称为误判。
-
• 使用的 BitMap 越长,误判率越低。
-
• hash 算法个数越多,误判率越低,但是执行一次操作花费的时间越多。
创建 RedisBloom 过滤器的时候只需要指定期望的错误率和容纳元素个数,它会根据公式自动计算出满足期望错误率的 BitMap 长度和 hash 算法个数。详细可参考《Redis 深度历险》,RedisBloom 在线计算器[1]。
布隆过滤器有个缺点,只能往过滤器中添加元素,不能删除。除非你讲整个过滤器删掉,重新创建加载数据。
准备工作
先安装好Redis服务,可以参考 在Linux部署单机Redis[2]。
# 查看是否有编译套件
gcc --help
# 如果没有就安装编译套件 GCC
yum install gcc
安装步骤
下载和编译
去 GitHub RedisBloom Releases[3] 下载,创建单独目录,将下载包放到此目录,和Redis有关包放一起。
mkdir -p ~/soft/redis
echo "解压" > /dev/null
tar -xf ~/soft/redis/RedisBloom-2.2.6.tar.gz -C ~/soft/redis/
echo "编译" > /dev/null
make -C ~/soft/redis/RedisBloom-2.2.6
echo "将生成的扩展库文件放到自己指定位置" > /dev/null
cp ~/soft/redis/RedisBloom-2.2.6/redisbloom.so /opt/soft/redis6/
配置启动方式
配置启动有三种方式,修改Redis配置文件,通过客户端redis-cli或者在Redis启动命令中添加参数,参考 Redisbloom Configuration[4]。
可以通过选项 ERROR_RATE(默认 0.01) 和 INITIAL_SIZE(默认 100) 调整期望的错误率和期望添加元素数量的默认值。如果创建过滤器的时候没有指定,会使用这两个值。
-
• 通过 .conf:修改配置文件 .conf 指定 RedisBloom 扩展文件路径。
loadmodule redisbloom.so OPT1 OPT2
-
• 通过 redis-cli
loadmodule redisbloom.so OPT1 OPT2
-
• 通过命令行启动
redis-server --loadmodule ./redisbloom.so OPT1 OPT2
配置文件启动
vim /etc/redis/6379.conf
添加下面配置,后重启Redis。
# 期望的错误率 0.004 期望添加元素数量 400
loadmodule /opt/soft/redis6/redisbloom.so ERROR_RATE 0.004 INITIAL_SIZE 400

常用指令
参考 Redisbloom Commands[5]。
-
• BF.RESERVE 创建、预分配
# {键} {期望错误率} {期望容纳元素数量} [EXPANSION n 超出增加 n 备容量 | 超出返回错误] EXPANSION 和 NONSCALING 二选一
BF.RESERVE {key} {error_rate} {capacity} [EXPANSION {expansion}] [NONSCALING]
# 例子
# 错误率 0.001,期望添加 200 个元素,元素数量超出增加 3 备容量 = 800
BF.RESERVE test 0.001 200 EXPANSION 3
# 错误率 0.001,期望添加 200 个元素,元素数量超出返回错误
BF.RESERVE test 0.001 200 NONSCALING
-
• BF.ADD 添加元素
BF.ADD {key} {item}
# 例子
BF.ADD test value1 -
• BF.EXISTS 添加元素
BF.EXISTS {key} {item}
# 例子
BF.EXISTS test value -
• 删除过滤器用 Redis 本身的 DEL 指令
测试
通过 redis-cli 连接

参考
GitHub – RedisBloom Releases[6]
RedisBloom 官网[7]
RedisBloom 在线计算器[8]
在Linux部署单机Redis[9]
引用链接
[1]
RedisBloom 在线计算器: https://krisives.github.io/bloom-calculator/[2]
在Linux部署单机Redis: https://blog.csdn.net/qq_27022339/article/details/119452528[3]
GitHub RedisBloom Releases: https://github.com/RedisBloom/RedisBloom/releases[4]
Redisbloom Configuration: https://oss.redis.com/redisbloom/Configuration/[5]
Redisbloom Commands: https://oss.redis.com/redisbloom/Bloom_Commands/[6]
GitHub – RedisBloom Releases: https://github.com/RedisBloom/RedisBloom/releases[7]
RedisBloom 官网: https://oss.redis.com/redisbloom/[8]
RedisBloom 在线计算器: https://krisives.github.io/bloom-calculator/[9]
在Linux部署单机Redis: https://blog.csdn.net/qq_27022339/article/details/119452528
原文始发于微信公众号(我有八千部下):Redis布隆过滤器的原理和安装使用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/102232.html