如何使用Redis Streams

Roshan Kumar是Redis Labs的高级产品经理。

内存多模型数据库Redis在许多用例中都很流行。 其中包括内容缓存 ,会话存储,实时分析,消息代理和数据流。 去年,我写了关于如何使用Redis发布/订阅,列表和排序集进行实时流处理的文章。 现在,随着Redis 5.0的到来,Redis具有全新的数据结构,旨在管理流。

[InfoWorld的要点: 如何选择正确的数据集成工具Cosmos DB如何确保全球云中的数据一致性 | 通过InfoWorld大数据和分析报告时事通讯深入了解分析和大数据。 ]

使用Redis Streams数据结构,您可以做的事情比发布/订阅,列表和排序集要多得多。 在众多好处中,Redis Streams使您可以执行以下操作:

  • 收集大量高速到达的数据(唯一的瓶颈是网络I / O);
  • 在许多生产者和许多消费者之间建立数据通道;
  • 即使生产者和消费者的运作速度不同,也可以有效地管理您的数据消耗;
  • 当您的使用者脱机或断开连接时保留数据;
  • 生产者和消费者之间异步通信;
  • 扩大您的消费者数量;
  • 当使用者在使用数据时失败时,实现类似于事务的数据安全; 和
  • 有效地使用您的主内存。

Redis Streams最好的部分是它内置在Redis中,因此不需要额外的步骤来部署或管理Redis Streams。 在本文中,我将向您介绍使用Redis Streams的基础知识。 我们将研究如何向流中添加数据,以及如何读取数据(一次,异步,到达等)来满足不同的消费者用例。

在此后的两篇文章中,我将讨论Redis Streams的消费者组的工作方式,并展示一个使用Redis Streams的有效应用程序。

了解Redis流中的数据流

Redis Streams提供了一种“仅追加”数据结构,该结构看起来类似于日志。 它提供了一些命令,使您可以将源添加到流,使用流以及监视和管理如何使用数据。 Streams数据结构是灵活的,允许您以多种方式连接生产者和消费者。

Redis流图1 Redis实验室

图1.一个具有一个生产者和一个消费者的Redis Streams的简单应用程序。

图1展示了Redis Streams的基本用法。 单个生产者充当数据源,其生产者是将数据发送到相关接收者的消息传递应用程序。

Redis流图2 Redis实验室

图2.具有多个使用者的应用程序从Redis Streams中读取数据。

在图2中,一个以上的使用者使用了一个公共数据流。 借助Redis Streams,消费者可以按照自己的节奏读取和分析数据。

在下一个应用程序中,如图3所示,事情变得更加复杂。 该服务从多个生产者接收数据,并将所有数据存储在Redis Streams数据结构中。 该应用程序有多个使用者从Redis Streams中读取数据,以及一个使用者组,该使用者组支持无法以与生产者相同的速率进行操作的使用者。

Redis流图3 Redis实验室

图3. Redis Streams支持多个生产者和消费者。

使用Redis Streams将数据添加到流中

图3中的图仅显示了将数据添加到Redis流的一种方法。 尽管一个或多个生产者可以将数据添加到数据结构中,但是任何新数据始终会附加到流的末尾。

添加数据的默认方法

这是将数据添加到Redis流中的最简单方法:

XADD mystream * name Anna
XADD mystream * name Bert
XADD mystream * name Cathy

在此命令中,XADD是Redis命令,mystream是流的名称,Anna,Bert和Cathy是在每行中添加的名称,并且*运算符告诉Redis自动生成每行的标识符。 此命令产生三个mystream条目:

1518951481323-0 name Cathy
1518951480723-0 name Bert
1518951480106-0 name Anna

为每个条目添加具有用户管理的ID的数据

Redis为您提供了一个为每个条目维护自己的标识符的选项(请参见下文)。 尽管在某些情况下这可能很有用,但通常依靠自动生成的ID更为简单。

XADD mystream 10000000 name Anna
XADD mystream 10000001 name Bert
XADD mystream 10000002 name Cathy

这将导致以下mystream条目:

10000002-0 name Cathy
10000001-0 name Bert
10000000-0 name Anna

以最大限制添加数据

您可以为流添加最多条目数:

XADD mystream MAXLEN 1000000 * name Anna
XADD mystream MAXLEN 1000000 * name Bert
XADD mystream MAXLEN 1000000 * name Cathy

当流的长度达到1,000,000左右时,此命令将逐出较旧的条目。

提示:Redis Streams将数据存储在基数树的宏节点中。 每个宏节点都有一些数据项(通常在几十个范围内)。 如下所示,添加一个近似的MAXLEN值可以避免每次插入都需要操纵宏节点。 如果几十个数字(例如1000000或1000050)对您影响不大,则可以通过使用近似字符(〜)调用命令来优化性能。

XADD mystream MAXLEN ~ 1000000 * name Anna
XADD mystream MAXLEN ~ 1000000 * name Bert
XADD mystream MAXLEN ~ 1000000 * name Cathy

使用Redis Streams从流中消费数据

Redis Streams结构提供了丰富的命令和功能集,可通过多种方式使用您的数据。

从流的开头阅读所有内容

情况:流已经具有您需要处理的数据,并且您希望从头开始处理所有数据。

用于此目的的命令是XREAD,它允许您从流的开头读取所有或前N个条目。 作为最佳实践,逐页读取数据始终是一个好主意。 要从流的开头读取多达100个条目,命令为:

XREAD COUNT 100 STREAMS mystream 0

假设1518951481323-0是您在上一条命令中收到的项目的最后一个ID,则可以通过运行以下命令来检索下100个条目:

XREAD COUNT 100 STREAMS mystream 1518951481323-1

异步使用数据(通过阻塞调用)

情况:消费者使用和处理数据的速度快于向流中添加数据的速度。

在许多用例中,消费者读取的速度比生产者向流中添加数据的速度快。 在这些情况下,您希望使用者等待并在收到新数据时收到通知。 BLOCK选项允许您指定等待新数据的时间长度:  

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

在这里,XREAD返回1518951123456-1之后的所有数据。 如果之后没有数据,查询将等待N = 60秒,直到新数据到达,然后超时。 如果要无限阻塞此命令,请按以下方式调用XREAD:

XREAD BLOCK 0 STREAMS mystream 1518951123456-1 

注意在此示例中,您还可以使用XRANGE命令逐页检索数据。  

在到达时仅读取新数据

情况:您仅对从当前时间点开始的新数据集感兴趣。

当您反复读取数据时,从上次中断的地方重新开始总是一个好主意。 例如,在前面的示例中,您进行了阻止调用以读取大于1518951123456-1的数据。 但是,首先,您可能不知道最新的ID。 在这种情况下,您可以使用$符号开始读取流,该符号告诉XREAD命令仅检索新数据。 由于此调用在60秒钟内使用了BLOCK选项,因此它将等待,直到流中有一些数据为止。

XREAD BLOCK 60000 STREAMS mystream $

在这种情况下,您将使用$选项开始读取新数据。 但是,不应使用$选项进行后续调用。 例如,如果1518951123456-0是在先前调用中检索到的数据的ID,则您的下一个调用应为:

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

迭代流以读取过去的数据

情况:您的数据流已经有足够的数据,并且您想查询它以分析到目前为止收集的数据。

您可以分别使用XRANGE和XREVRANGE向前或向后读取两个条目之间的数据。 在此示例中,该命令读取1518951123450-0和1518951123460-0之间的数据:

XRANGE mystream 1518951123450-0 1518951123460-0

XRANGE还允许您借助COUNT选项来限制返回的项目数。 例如,以下查询返回两个时间间隔之间的前10个项目。 使用此选项,您可以像使用SCAN命令一样遍历流:

XRANGE mystream 1518951123450-0 1518951123460-0 COUNT 10

当您不知道查询的下限或上限时,可以将下限替换为–,将上限替换为+。 例如,以下查询返回流开头的前10个项目:

XRANGE mystream - + COUNT 10

XREVRANGE的语法类似于XRANGE,不同之处在于您可以颠倒上下边界的顺序。 例如,以下查询以相反的顺序返回流末尾的前10个项目:

XREVRANGE mystream + - COUNT 10

在多个消费者之间分配数据

情况:消费者使用数据的速度远远低于生产者生产数据的速度。

在某些情况下,包括图像处理,深度学习和情感分析,与生产者相比,消费者可能会非常慢。 在这些情况下,通过散布使用者并划分每个使用者消耗的数据,使数据到达速度与消耗的数据相匹配。

借助Redis Streams,您可以使用使用者组来完成此任务。 当一个用户中有一个以上的用户时,Redis Streams将确保每个用户都收到一组专有数据。

XREADGROUP GROUP mygroup consumer1 COUNT 2 STREAMS mystream >

当然,还有很多关于消费者群体如何工作的知识。 Redis Streams消费者组旨在对数据进行分区,从灾难中恢复并提供交易数据安全性。 我将在我的下一篇文章中解释所有这些。

如您所见,Redis Streams很容易上手。 只需下载并安装Redis 5.0并深入研究项目网站上的Redis Streams教程

Roshan Kumar是 Redis Labs 的高级产品经理 他在软件开发和技术营销方面拥有丰富的经验。 Roshan在惠普和许多成功的硅谷初创公司工作,包括ZillionTV,Salorix,Alopa和ActiveVideo。 作为一个热情的程序员,他设计并开发了mindzeal.com,这是一个为年轻学生提供计算机编程课程的在线平台。 Roshan拥有计算机科学学士学位,并拥有圣塔克拉拉大学的MBA学位。

-

新技术论坛提供了一个以前所未有的深度和广度探索和讨论新兴企业技术的场所。 选择是主观的,是基于我们对InfoWorld读者认为最重要和最感兴趣的技术的选择。 InfoWorld不接受发布的营销担保,并保留编辑所有贡献内容的权利。 将所有查询发送到 newtechforum@infoworld.com

From: https://www.infoworld.com/article/3320021/how-to-use-redis-streams.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值