Redis布隆过滤器的原理和安装使用

前言

本文讲述布隆过滤器 (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 在线计算器

布隆过滤器有个缺点,只能往过滤器中添加元素,不能删除。除非你讲整个过滤器删掉,重新创建加载数据。

准备工作

先安装好Redis服务,可以参考 在Linux部署单机Redis

# 查看是否有编译套件
gcc --help
# 如果没有就安装编译套件 GCC
yum install gcc

安装步骤

下载和编译

GitHub RedisBloom Releases 下载,创建单独目录,将下载包放到此目录,和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

可以通过选项 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

image-20210926104743294

常用指令

参考 Redisbloom Commands

  • 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

RedisBloom 官网

RedisBloom 在线计算器

在Linux部署单机Redis

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我有八千部下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值