首页 > 数据库 >Redis布隆过滤器的原理和安装使用

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

时间:2023-04-05 19:46:41浏览次数:161  
标签:BF RedisBloom redis Redis 布隆 value 过滤器

前言

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

标签:BF,RedisBloom,redis,Redis,布隆,value,过滤器
From: https://www.cnblogs.com/shuiyao3/p/17290682.html

相关文章

  • Redis 在排行榜中的应用
    1.Redis的SortedSet数据类型1.1SortedSet数据类型的特点SortedSet有序集合是Redis提供的一种重要的数据类型。它是由不重复且有序的字符串元素组成的,而且每个元素都会关联一个double类型的分数,通过该分数来为集合中的成员进行从小到大的排序。SortedSet的......
  • Redis持久化RDB和AOF原理解析、使用和优缺点对比
    前言本文讲述Redis两种持久化方式RDB和AOF优缺点以及原理。为何需要持久化?Redis是基于内存操作的,进程终止、服务器宕机后内存数据会丢失,但是在很多使用场景中我们希望数据不丢失,服务重启之后数据还能恢复到停机前的状态,特别是使用Redis做数据库的情况。Redis持久化......
  • Redis 在身份认证中的应用
    1.Redis在Session共享问题中的应用传统Session-Cookeis身份认证方法中,一个Session只保存在一台服务器上,适合域单体应用。随着项目规模的增加,项目的架构也不断向微服务分布式集群演进,传统的Session-Cookie方式在集群环境下就不能很好的工作了,这时就产生了Session共......
  • Redis 缓存机制
    1.Redis缓存缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。Redis因读写性能较高,它非常适合作为存贮数据......
  • 在Linux部署Redis主从和哨兵集群实现高可用
    前言本文主要讲述在Linux系统中配置和部署Redis主从集群和哨兵,实现高可用和自动故障迁移。准备工作参考Redis单机部署安装3个Redis服务作一主二从,本文准备了6380(主)、6381(从)和6382(从)。参考Redis单机部署安装3个Redis服务作哨兵集群,本文准备了26380......
  • 在Linux部署Redis Cluster集群
    前言本文讲述在Linux系统部署RedisCluster实现数据分片的具体步骤。请参考Redis单机部署下载编译。RedisCluster是什么?RedisCluster是官方提供的一种用数据分片来实现横向扩容的解决方案,由一个或多个Redis服务组成一个无主集群。对Key使用哈希算法将数据分散......
  • 在Linux部署Redis代理Predixy实现数据分片
    前言本文以predixy-1.0.5为例,讲述Redis代理Predixy安装过程。Predixy是一款高性能全特征Redis代理,支持Redis-sentinel和Redis-cluster。作者拿其它常用代理做了性能测评,Predixy在各个维度性能都是最优的,与其他代理的功能对比。我们可以通过取模、随机、一致性哈希......
  • 在Linux部署Redis代理Twemproxy实现数据分片
    前言本文主要讲述Redis代理Twemproxy安装过程。Twemproxy是推特开源用于Memcached和Redis的轻量级代理。这里以0.5.0版本为例。我们可以通过取模、随机、一致性哈希等算法将数据分散在多个Redis服务来实现水平扩展。但是客户端直连就需要跟每个Redis服务产生连接,......
  • Redis——(主从复制、哨兵模式、集群)的部署及搭建
    重点:主从复制:主从复制是高可用redis的基础,主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。哨兵和集群都是在主从复制基础上实现高可用的。缺点:故障恢复无法自动化,写操作无法负载均衡,存储能力受到单机的限制。哨兵:在主从复制的基础上,哨兵......
  • 在Linux部署单机Redis完整过程
    前言本文以redis-6.2.5为例,讲述在Linux系统下单机Redis下载、编译、打包、安装为服务、启动和访问的整个过程。安装环境为LinuxCentOS64,本文用的7.5版本.下载编译目录在当前目录soft/redis下,最终服务可执行程序在/opt/soft/redis6中。准备工作#查看是否有文件下载......