Redis 布隆过滤器的相关命令的使用

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis 布隆过滤器的相关命令的使用

因为平常使用 Docker 比较多,所以照常还是使用Docker来准备环境啦。

一、Docker 安装 Redis 布隆过滤器

Redis 本身并不支持布隆过滤器,而是采用插件的方式去安装的,以达到一种热拔插的效果。

因为我对于 liunx 来说就是一个小白,所以还是用 docker 香。

我就开始搜索如何为 docker 上的 Redis 安装布隆过滤器, 实现方式我看了看有好几种~,但是大都数都需要去下载 redis 布隆过滤器的那个模块,我觉得这样也太麻烦了,肯定有前人偷过懒了,果然有更直接的方式~

学习历史重要原因之一,就是要学会感恩,因为我们都是站在巨人的肩膀上

Docker 上有个redislabs/rebloom的镜像,它是将 redis布隆过滤器打包在一起的一个镜像,直接使用这个镜像启动的redis容器,直接就可以使用布隆过滤器~👩‍💻

1.1、安装

搜索镜像

 docker search redislabs/rebloom

image.png

拉取镜像

 docker pull redislabs/rebloom

image.png

启动镜像

 docker run -d -p 6379:6379 --name myrebloom redislabs/rebloom

image.png

注意

我只是为了有个写demo的环境,所以redis未落盘,也未设置密码,用的也是默认端口,真实要用,不能这么玩,当然也没这样玩的

1.2、测试

进入容器中,我们来用redis-cli玩一玩~

 docker exec -it [容器名|容器id] bash #/bin/bash 都可
 redis-cli

image.png


确定没啥问题,咱们来玩 Redis 的布隆过滤器

二、RedisBloom 命令讲解

2.1、命令大纲

先看看总共有哪些命令,待会咱们一条一条来尝试,均来自redis官网

Command Description
BF.ADD 添加一个元素到布隆过滤器
BF.EXISTS 判断元素是否在布隆过滤器
BF.INFO 返回有关布隆过滤器的信息
BF.INSERT 将多个元素添加到过滤器。如果键不存在,它会创建一个新的过滤器。
BF.MADD 添加多个元素到布隆过滤器
BF.MEXISTS 判断多个元素是否在布隆过滤器
BF.RESERVE 创建一个布隆过滤器。设置误判率和容量
BF.SCANDUMP 开始增量保存 Bloom 过滤器。
BF.LOADCHUNK 恢复之前使用BF.SCANDUMP保存的布隆过滤器。

2.2、BF.ADD 和 BF.MADD

语法格式:

 BF.ADD key value 
 ​
 BF.MADD key value1 value2 ...

当key不存在的时候,会创建一个空的布隆过滤器,并会给定一个默认的误判率和含有上限容量的的子过滤器。并且通过这种方式创建出来的布隆过滤器,是能够自动缩放的。

每一次扩容,新的子过滤器是用前一个子过滤器的大小来进行扩张,默认扩张倍数为2.

BF.ADD类似于集合的sadd命令,不过bf.add一次只能添加一个元素到集合中。一次性添加多个则使用bf.madd.

image.png


2.3、BF.EXISTS 和 BF.MEXISTS

上面也已经用到了,它就是用来判断元素是否在布隆过滤器中

语法:

 bf.exists key value
 bf.mexists key value1 value2 ...

存在返回1,不存在返回0


image.png

2.4、BF.INFO

返回有关布隆过滤器的信息,

语法格式:

 bf.info key

image.png

 Capacity #  子过滤器的上限
 (integer) 100
 Size #布隆过滤器的容量大小
 (integer) 296 
 Number of filters  #当前过滤器数量 这里应该是记录子过滤器数量吧
 (integer) 1
 Number of items inserted # 插入的值的数量
 (integer) 1
 Expansion rate #默认的扩张倍数
 (integer) 2

一个数据看不出来,多插入两条,看一下对比,大家就明白了

image.png

2.5、BF.RESERVE

语法格式:

 bf.reserve key error_rate capacity [EXPANSION expansion] [NONSCALING]

使用 bf.reserve 命令创建一个自定义的布隆过滤器。bf.reserve命令有三个参数,分别是:

  • key:键
  • error_rate:期望错误率,期望错误率越低,需要的空间就越大。默认 0.1
  • capacity:初始容量,当实际元素的数量超过这个初始化容量时,误判率上升。 默认 100

然后还有两个可选参数: EXPANSIONNONSCALING

1、EXPANSION:简单说它就是扩张倍数,省略则默认为2。

如果要存储在过滤器中的元素数量未知,我们建议您使用expansion2 或更多来减少子过滤器的数量。否则,我们建议您使用 expansion1 来减少内存消耗。默认扩展值为 2。

2、NONSCALING:如果写了这个参数,在达到初始容量,为防止过滤器创建额外的子过滤器。过滤器在达到容量时会返回错误capacity,当让非缩放过滤器比缩放过滤器需要的内存略少。

示例:

 bf.reserve nzc:redisboom1 0.01 100
 ​
 bf.reserve nzc:redisboom2 0.01 100  EXPANSION 1 
 ​
 bf.reserve nzc:redisboom3 0.01 100  NONSCALING

我把相关的信息都打印出来了,大家从所输出的信息中也能够看出它们的一些区别。

image.png


image.png

小结:

  1. 如果是预估不到数据的范围量,而且没有办法计算的增长量,那么我觉得暂定为默认的即可。
  2. 如果是能够估算数据的大致范围,数据增长速度有迹可循,那么可以适当的推算一下EXPANSION这个参数该设置的大小。
  3. 如果数据范围没有那么那么大,并且可以接受较大程度的误判率,那么EXPANSION设置为1会更好,能够节省内存消耗。
  4. NONSCALING如果使用此参数,则是将数组大小固定了,需要考虑清楚是否适合。
  5. 布隆过滤器的 error_rate 越小,需要的存储空间就越大,对于不需要过于精确的场景,error_rate设置稍大一点也可以。布隆过滤器的capacity设置的过大,会浪费存储空间,设置的过小,就会影响准确率,所以在使用之前一定要尽可能地精确估计好元素数量,还需要加上一定的冗余空间以避免实际元素可能会意外高出设置值很多。总之,error_ratecapacity都需要设置一个合适的数值。

2.6、BF.INSERT

语法格式

 BF.INSERT key [CAPACITY capacity] [ERROR error]
   [EXPANSION expansion] [NOCREATE] [NONSCALING] ITEMS item [item...]

由中括号包裹的都是可选参数。大都数参数上面都说到了

NOCREATE指示如果过滤器不存在,则不应创建它。如果过滤器尚不存在,则返回错误而不是自动创建它。这可以用于过滤器创建和过滤器添加之间需要严格分离的地方。

示例:


 BF.INSERT nzc:redisboom4  items key1 key2 key3

image.png补充:

 BF.SCANDUMP # 开始布隆过滤器的增量保存。这对于无法适应法线DUMP和RESTORE模型的大型布隆过滤器很有用。
 BF.LOADCHUNK  #恢复以前使用保存的过滤器SCANDUMP。

这两点就不咋说啦~

后记

一篇简简单单的文章~

就剩最后几天了,更文要结束啦~

下一次,应该会变成佛系的参与者了吧

下一次准备好好的重构自己的知识体系了,我已经开始慢慢变得为了更文而更文了,已经有点偏离属于自己的轨道了

下次一定


目录
相关文章
|
5月前
|
存储 缓存 监控
Redis设计与实现——Redis命令参考与高级特性
Redis 是一个高性能的键值存储系统,支持丰富的数据类型(字符串、列表、哈希、集合等)和多种高级功能。本文档涵盖 Redis 的核心命令分类,包括数据类型操作、事务与脚本、持久化、集群管理、系统监控等。特别介绍了事务的原子性特性、Lua 脚本的执行方式及优势、排序机制、发布订阅模型以及慢查询日志和监视器工具的使用方法。适用于开发者快速掌握 Redis 常用命令及其应用场景,优化系统性能与可靠性。
|
24天前
|
存储 缓存 NoSQL
Redis基础命令与数据结构概览
Redis是一个功能强大的键值存储系统,提供了丰富的数据结构以及相应的操作命令来满足现代应用程序对于高速读写和灵活数据处理的需求。通过掌握这些基础命令,开发者能够高效地对Redis进行操作,实现数据存储和管理的高性能方案。
61 12
|
22天前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
2月前
|
存储 缓存 人工智能
Redis六大常见命令详解:从set/get到过期策略的全方位解析
本文将通过结构化学习路径,帮助读者实现从命令语法掌握到工程化实践落地的能力跃迁,系统性提升 Redis 技术栈的应用水平。
|
3月前
|
NoSQL Redis
Lua脚本协助Redis分布式锁实现命令的原子性
利用Lua脚本确保Redis操作的原子性是分布式锁安全性的关键所在,可以大幅减少由于网络分区、客户端故障等导致的锁无法正确释放的情况,从而在分布式系统中保证数据操作的安全性和一致性。在将这些概念应用于生产环境前,建议深入理解Redis事务与Lua脚本的工作原理以及分布式锁的可能问题和解决方案。
132 8
|
5月前
|
存储 缓存 NoSQL
Redis中的常用命令-get&set&keys&exists&expire&ttl&type的详细解析
总的来说,这些Redis命令提供了处理存储在内存中的键值对的便捷方式。通过理解和运用它们,你可以更有效地在Redis中操作数据,使其更好地服务于你的应用。
357 17
|
5月前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
844 16
|
5月前
|
JSON NoSQL Redis
在Rocky9系统上安装并使用redis-dump和redis-load命令的指南
以上步骤是在Rocky9上使用redis-dump和redis-load命令顺利出行的秘籍。如果在实行的过程中,发现了新的冒险和挑战,那么就像一个勇敢的航海家,本着探索未知的决心,解决问题并前进。
159 14
|
5月前
|
消息中间件 NoSQL Unix
Redis的基本特性以及其基础命令用法
这只是冰山一角,Redis的强大功能和简洁的操作方法值得我们深入了解和掌握,是复杂数据问题解决的有力工具。所以,来一场有趣的Redis冒险吧!
165 6
|
10月前
|
NoSQL 应用服务中间件 API
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
1510 160

热门文章

最新文章