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 Streams的简单应用程序。

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

Redis实验室

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

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

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

Redis实验室

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

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

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

添加数据的默认方法

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

XADD mystream * name AnnaXADD mystream * name BertXADD mystream * name Cathy

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

1518951481323-0 name Cathy1518951480723-0 name Bert1518951480106-0 name Anna

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

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

XADD mystream 10000000 name AnnaXADD mystream 10000001 name BertXADD mystream 10000002 name Cathy

这将导致以下mystream条目:

10000002-0 name Cathy10000001-0 name Bert10000000-0 name Anna

以最大限制添加数据

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

XADD mystream MAXLEN 1000000 * name AnnaXADD mystream MAXLEN 1000000 * name BertXADD mystream MAXLEN 1000000 * name Cathy

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

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

XADD mystream MAXLEN ~ 1000000 * name AnnaXADD mystream MAXLEN ~ 1000000 * name BertXADD 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

如何使用Redis Streams相关推荐

  1. Redis Streams 介绍

    Stream是Redis 5.0版本引入的一个新的数据类型,它以更抽象的方式模拟日志数据结构,但日志仍然是完整的:就像一个日志文件,通常实现为以只附加模式打开的文件,Redis流主要是一个仅附加数据结 ...

  2. redis streams_初步了解Redis Streams以及如何在Java中使用它们

    redis streams 自今年年初以来,Redis Streams已进入Redis的unstable分支,并且第一个客户开始采用Redis Streams API. 因此,这是一个绝佳的时间,可以 ...

  3. 初步了解Redis Streams以及如何在Java中使用它们

    自今年年初以来,Redis Streams已进入Redis的unstable分支,并且第一个客户端始于采用Redis Streams API. 因此,这是一个绝佳的时机,可以从客户端角度看一下Redi ...

  4. 【译】Redis喜提新数据结构:Redis Streams

    本文是Redis作者antirez的一篇博客 原文地址:antirez.com/news/128 我们在Redis5版本迎来了一个新的数据结构,它的名字叫做"Streams".(撒 ...

  5. Redis 生产架构选型解决方案

    以下文章来源方志朋的博客,回复"666"获面试宝典 推荐使用更新的引擎版本以支持更多的特性. Redis 6.0新特性说明: 模块系统新增多个API. 支持SSL/TLS加密. 支 ...

  6. Redis生产环境架构选型方案对比

    推荐使用更新的引擎版本以支持更多的特性. Redis 6.0新特性说明: 模块系统新增多个API. 支持SSL/TLS加密. 支持新的Redis协议:RESP3. 服务端支持多模式的客户端缓存. 支持 ...

  7. Streams:深入理解Redis5.0新特性

    概述 相较于Redis4.0,Redis5.0增加了很多新的特性,而streams是其中最重要的特性之一.streams是redis 的一种基本数据结构,它是一个新的强大的支持多播的可持久化的消息队列 ...

  8. Redis高级客户端Lettuce详解

    前提 Lettuce是一个Redis的Java驱动包,初识她的时候是使用RedisTemplate的时候遇到点问题Debug到底层的一些源码,发现spring-data-redis的驱动包在某个版本之 ...

  9. 使用Redis Stream来做消息队列和在Asp.Net Core中的实现

    Redis - Wikipedia 写在前面 我一直以来使用redis的时候,很多低烈度需求(并发要求不是很高)需要用到消息队列的时候,在项目本身已经使用了Redis的情况下都想直接用Redis来做消 ...

  10. 你还不了解Redis的发布/订阅功能与Redis的Stream吗

    一.Redis 中的发布/订阅功能 发布/ 订阅系统 是 Web 系统中比较常用的一个功能.简单点说就是 发布者发布消息,订阅者接受消息,这有点类似于我们的报纸/ 杂志社之类的: (借用前边的一张图) ...

最新文章

  1. qzone.class.php,PHP实现QQ空间自动回复说说的方法
  2. 匹配月份_5月份轿车销量榜单出炉 雅阁热销18634辆
  3. Exchange Server 2013 DAG高可用部署(三)-服务器角色安装
  4. Node — 第六天(前后端分离)及(身份验证)
  5. 分享干货:靠刷算法题,真的可以刷进大厂吗?
  6. 鼠标移入视频播放,鼠标移出播放停止,恢复到原来状态
  7. 轮询数据库 java_谁做过定时任务,轮询查询数据。
  8. QT 008 UI Add action 的方法
  9. 突然!华为P30 Pro真机上手视频曝光:屏幕指纹解锁秒开
  10. Python使用nmap进行端口扫描
  11. java的有意思的_发现一个有意思的项目banana
  12. WPF 登录界面跳转代码
  13. python问卷星微信登录_python
  14. windows x64和x86的区别
  15. kotlin中的val 真的是只读吗?关于val 的一个细节
  16. 【慕课网】前端零基础入门---步骤二:页面化妆师CSS---02-CSS文本样式
  17. 【星球问答精选】我想打造个性化的高效工作流,不会编程怎么办?
  18. PCS/MES/ERP各层内容
  19. 华软mysql考试_在广州大学华软软件学院就读是怎样一番体验?
  20. 计算机辅助测控电路设计报告,测控电路实验报告(20210407082438)

热门文章

  1. 海康服务器如何设置通电自动开机,UNraid教程:教您设置自动关机功能!使用User Scripts插件 自动执行脚本 更省电!...
  2. 【PX4 飞控剖析】05 PIX4 连接QGC 可以烧录固件但是连接不上
  3. 2015php面试题,2015酷狗音乐php面试题
  4. Unity 制作伪全息
  5. epoll精粹二 - Linux C++网络编程(二十三)
  6. 直播第三方美颜sdk是什么?
  7. 深入分析 synchronized 的实现原理
  8. 如何编辑运行HTML网页文件(HTML编辑工具使用介绍)
  9. word2vec源码详解
  10. WPS制作的电子签名有法律效力吗