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

前言

本文讲述布隆过滤器 (RedisBloom) 的基本原理和安装使用。

RedisBloom是什么?

RedisBloom 是 Redis 中过滤器模块,可以用来判断值是否存在,常用来解决缓存穿透问题。

查询数据时,先用 RedisBloom 判断数据是否存在,不存在则直接返回,存在则从缓存 / 数据库获取后返回。

比如查询接口,可以将数据库能查出数据的条件值先添加到过滤器中,后续请求接口前先用过滤器进行判断,如果不存在代表查不出数据直接返回,这样减少后续业务压力。

又比如给用户推荐内容的时候,用户看过的可以添加到过滤器中,后续推荐时进行过滤,保证推送给用户的内容不重复。

Set 其实也可以实现过滤,缺点要占用大量内存,因为要保存完整 value 数据。

而 RedisBloom 则是利用 BitMap 来保存 value。添加的时候每个 value 都经过 n 个 hash 算法对 BitMap 取模算出位置置为 1,这样一个 value 会使多个位置为 1;判断是否存在的时候 value 同样经过 n 个 hash 算法取模算出多个位置,所有位置为 1 则代表 value 存在。

Redis布隆过滤器的原理和安装使用
在这里插入图片描述

基于这种方式它会具有如下特点:

  • • 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-cliloadmodule 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
Redis布隆过滤器的原理和安装使用
image-20210926104743294

常用指令

参考 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 连接

Redis布隆过滤器的原理和安装使用
在这里插入图片描述

参考

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!