摘要:本文将对Stream的常用命令和应用场景进行介绍,并探讨原生Redis Stream消息队列的缺陷以及GaussDB(for Redis)提供的解决方案,供大家学习和选用。

华为云高斯Redis团队欢迎各路英才加入,联系邮箱:yuwenlong4@huawei.com

引言:

Redis Stream是Redis 5.0引入的一种新的数据类型,其本质是一个消息队列,类似于 kafka等消息中间件。它提供了消息的落地存储功能,并实现了类似kafka消费组和消费者的功能。与kafka相比,Redis Stream同样拥有强大的功能,但因原生Redis无法有效支持大规模数据存储,成本昂贵,并存在数据丢失/不一致风险等原因,导致其未能流行起来。本文将对Stream的常用命令和应用场景进行介绍,并探讨原生Redis Stream消息队列的缺陷以及GaussDB(for Redis)提供的解决方案,供大家学习和选用。

一、Redis Stream简介

与Pub/Sub相比,Redis Stream 具有消息的落地存储功能,每一个客户端能访问任意时刻的消息,并且能记录每一个客户端的访问位置,还能保证消息不会丢失。Redis Stream 的结构如下所示,它有一个消息链表,将所有加入的消息都链接起来,每个消息都有唯一的 ID 和对应的内容。

如图所示,每一个Stream队列包含多条消息,每条消息由唯一的ID进行标识,由时间戳和序列号组成,例如1627849609889-0。每条消息以追加的方式添加到Stream队列中。同一个Stream队列可以包含多个消费组(Consumer Group),每个消费组的状态都是独立的,同一个Stream队列的消息可以被多个消费组重复消费。

同一个消费组又包含多个消费者(Consumer),这些消费者之间是竞争关系,不同消费者不会重复消费同一条消息,任意一个消费者读取了队列中的一条消息都会使消费组中的游标last_delivered_id往前移动。该方式提高了并发效率,例如,多个进程并发处理Stream队列中的消息。每个消费者中维持一个状态变量pending_ids,简称为PEL(Pending Entries List),记录了当前已经被客户端读取的但尚未被ACK的消息,确保消息被客户端成功消费。

Redis Stream命令可以分为消息队列命令和消费者命令两类,如下所示:

以即时通讯中的聊天室场景为例,使用Redis Stream作为中间件,实现聊天室的发言以及信息查看。

1)使用XADD命令进行发言。

2)使用XLEN命令获取聊天室发言的数量。

3)使用XRANGE获取消息队列的消息。

4)使用XREAD命令读取消息。可以在不设置消费组和消费者的情况下,使用XREAD的命令进行消息读取,此时Stream队列类似于一个普通的列表(list)。

更多的Redis Stream命令使用请参考官方文档(https://redis.io/commands/xread)。

二、应用场景

由于Redis Stream天然有序,特别适合存储时序数据,应用场景包括即时通讯、智慧医疗、流量削峰、智慧城市等领域。

(1)即时通讯:微信、QQ等是我们日常生活中常用的通讯软件,常用的聊天方式包含点对点通讯和群聊两种方式。下图是一个群聊的模型图,当采用Redis Stream作为通讯的中间件,创建一个群聊时,在Redis中对应地为该群聊创建一个Stream队列。在发送消息时,将每个用户的消息按照时间顺序添加到Stream队列中,保证了消息的有序性。由于Stream是一个持久化的队列,无论是在线还是离线状态,每个用户可以多次查看历史消息,保证了通讯的完整性。

(2)智慧医疗:医疗行业的信息化,可以更好地服务于每一个人。为每一个人从出生起建立一份健康档案,记录相应的健康信息,如体检报告、诊断报告、用药信息、以及智能终端实时上传的健康指标。这些信息都是一些时序数据,同样可以采用Redis Stream来实现智慧医疗系统。建立起智慧医疗系统后,使用终端可以查看所有的医疗信息,并会提示患者按时吃药,在终端上传身体指标异常时,会自动报警并预约挂号。现阶段每个医院都有自己的信息系统,不同的医院很难查到同一个患者的医疗信息,在未来,医疗上云将有利于解决医疗信息孤岛,更好的帮助每一位患者。

(3)流量削峰:在常见的秒杀活动或团购中,如春运抢票、商城促销等,通常短时间内有大量的流量,导致系统崩溃。由于每一个用户在请求时对应唯一的时间戳,所有的请求都有一个先后顺序,同样可以采用Redis Stream作为中间件,将请求加入到Redis Stream消息队列。将消息转存到消息队列间接提供给应用,而非直接发送给应用,可以防止大流量冲击导致的系统崩溃。当消息队列中的请求数量达到规定的最大值时,直接回复客户端抢购失败。

三、原生Redis是否真的适用于以上场景?

如上应用场景具有数据规模大、数据持续增长的特点,虽然原生Redis有良好的设计初衷,但是并不能解决实际问题。具体体现在:

  1. 无法有效应对大规模数据:原生Redis是一个基于内存的数据库,单个节点存储容量有限,当扩展至TB级别的集群,将会出现管理困难,运维成本高等问题。
  2. 集群扩容影响业务性能:原生Redis在进行集群扩容时,需要重新划分hash槽并进行数据迁移,必定会影响业务性能。
  3. 数据可能会丢失:原生Redis虽然可以采用RDB和AOF的方式对数据进行持久化,但是并不会实时地将每一条命令写入到硬盘中,当出现掉电或集群崩溃的情况,必定会丢失一部分数据,对于类似智慧医疗场景,是难以忍受的。

除此以外,必须考虑数据库系统的可用性、数据一致性、成本和备份恢复能力等情况:

  1. 可用性: 原生Redis若采用一主一备的集群模式,当一对主备节点下线,集群部分数据将不可用。
  2. 数据一致性:当主节点宕机,主备节点切换,数据存在没有完全同步的情况。
  3. 成本:原生Redis是一种内存型数据库,当内存容量扩展至TB级别,成本将非常昂贵。
  4. 备份恢复:需要人工连接数据库执行 SAVE或BGSAVE命令,不能支持定期自动备份,在恢复到新实例时需要手动拷贝备份数据。

四、是否有更好的解决方案?

在以上场景中,亟需一种能够存储和处理大规模Stream数据、鲁棒性强、且成本低廉的数据库系统。而GaussDB(for Redis)(下文简称高斯Redis)正是以上场景中一种很好的应用解决方案。高斯Redis是华为云数据库团队自主研发的兼容Redis协议的云原生数据库,该数据库突破原生Redis的内存限制,可轻松扩展至PB级存储,具有秒扩容、超可用、强一致和低成本等特点。

五、总结

Redis Stream可以广泛应用在即时通讯、智慧医疗、流量削峰等领域。在面对大规模的Stream数据时,原生Redis存在成本过高、容量太小、可用性差、数据不一致等问题,无法适用于海量消息队列的场景。与原生Redis相比,高斯Redis具有海量存储,低成本,可持久化等优点,可做为比原生Redis更理想的Stream队列承载方案。

附:参考资料

1. 《华为云GaussDB(for Redis)与自建开源Redis的成本对比》

https://www.modb.pro/db/42739

2. 《一场由fork引发的超时,让我们重新探讨了Redis的抖动问题》

https://bbs.huaweicloud.com/blogs/227525

3. 《当Redis遇见计算存储分离》

https://developer.huaweicloud.com/hero/forum/thread-83188-1-1.html

4. 《GaussDB(for Redis)与原生Redis的性能对比》

https://bbs.huaweicloud.com/blogs/236949

5. 《华为云PB级数据库GaussDB(for Redis)揭秘第一期:Redis与存算分离》

https://bbs.huaweicloud.com/blogs/238584

点击关注,第一时间了解华为云新鲜技术~

华为云PB级数据库GaussDB(for Redis)解析第二期:Redis消息队列Stream的应用探讨的更多相关文章

  1. 华为云PB级数据库GaussDB(for Redis)揭秘第八期:用高斯 Redis 进行计数

    摘要:高斯Redis,计数的最佳选择! 一.背景 当我们打开手机刷微博时,就要开始和各种各样的计数器打交道了.我们注册一个帐号后,微博就会给我们记录一组数据:关注数.粉丝数.动态数-:我们刷帖时,关注 ...

  2. 华为云PB级数据库GaussDB(for Redis)揭秘第七期:高斯Redis与强一致

    摘要:在KV数据库领域,"强一致性"不仅是一个技术名词,它更是业务与运维的重要需求. 清明刚过,五一假期就要来了.大好春光,不如去婺源看油菜花吧!小云迅速打开APP刷出余票2张,赶 ...

  3. 华为云数据库GaussDB(for Cassandra)揭秘第二期:内存异常增长的排查经历

    摘要:华为云数据库GaussDB(for Cassandra) 是一款基于计算存储分离架构,兼容Cassandra生态的云原生NoSQL数据库:它依靠共享存储池实现了强一致,保证数据的安全可靠. 本文 ...

  4. 用redis实现支持优先级的消息队列

    http://www.cnblogs.com/tianqiq/p/4309791.html http://www.cnblogs.com/it-cen/p/4312098.html http://ww ...

  5. Redis学习之实现优先级消息队列

    很久没有写博客了,最近简单的学习了一下Redis,其中学习了一下用Redis实现优先级消息队列.关于更多更为详细的可以在www.redis.cn找到相关资料. 对于熟悉Redis的童鞋提到队列很自然的 ...

  6. 用 Redis 实现 PHP 的简单消息队列

    参考:PHP高级编程之消息队列 消息队列就是在消息的传输过程中,可以保存消息的容器. 常见用途: 存储转发:异步处理耗时的任务 分布式事务:多个消费者消费同一个消息队列 应对高并发:通过消息队列保存任 ...

  7. redis(五)---- 简单消息队列

    消息队列一个消息的链表,是一个异步处理的数据处理引擎.不仅能够提高系统的负荷,还能够改善因网络阻塞导致的数据缺失.一般用于邮件发送.手机短信发送,数据表单提交.图片生成.视频转换.日志储存等. red ...

  8. 使用redis原生list结构作为消息队列取代celery框架。

    1.web后台对大批量的繁重的io任务需要解耦使用分布式异步技术,否则会使接口阻塞,并发延迟,一般就选celery好了.此篇的取代主要是针对取代celery的worker模式.没有涉及到周期和定时模式 ...

  9. 华为云企业级Redis评测第一期:稳定性与扩容表现

    摘要:采用Redis Labs推出的多线程压测工具memtier_benchmark对比测试下GaussDB(for Redis) 和原生Redis的特性差异. 本文分享自华为云社区<华为云企业 ...

  10. 华为云企业级Redis揭秘第16期:超越开源Redis的ACID"真"事务

    摘要: 开源Redis只支持伪事务,应用场景受限.高斯Redis发布企业级事务特性,支持完备ACID,为交易.库存等上层业务带来全新可能. 本文分享自华为云社区<华为云企业级Redis揭秘第16 ...

随机推荐

  1. [Python] 利用python的第三方库xlrd和xlwt来处理excel数据

    今天在处理excel表格的时候,有一个需要提取表格中部分数据的操作.如果人工操作的话,有将近几千行,这样重复操作劳民伤财. 所以python就派上用场了. 简单介绍一下我要处理的问题,在excel一列 ...

  2. P3214 [HNOI2011] 卡农 题解

    感觉不是很麻烦,可能就组合排列转化绕一点... 抽象化题意 给定 \(n\) 个元素,从中选出 \(m\) 个集合,要求: 集合不为空,集合里不能有相同的元素 \(m\) 个集合都互不相同 所有元素被 ...

  3. SQL Server数据库创建远程服务器备份计划(小白详细图文教程)

    一.前言 最近项目系统做安全加固,以前是本地备份,现在需要做远程内网服务器数据库备份,后期也有可能做异地备份.下面以SQL Server2016 内网服务器数据库备份为例, 数据库服务器地址:192. ...

  4. Markdown使用心得(简单用法解析)

    Markdown使用心得(简单用法解析) Markdown的优势 个人看来,MD的优势在于脱离对鼠标的依赖,在简单的熟悉后,从段落格式到字体特效的实现都可以完全脱离鼠标.避免了为了格式和艺术效果多次将 ...

  5. 适合业余爱好者DIY的高精度数字电桥

    基本状况:工作频率: 100Hz,1kHz,7.813kHz最小分辨:最小分辨0.5毫欧,0.03uH,0.02pF最大分辨:G欧基本量程精度:1kHz基本量程精度,0.5%,选好电阻,精心制作,可以 ...

  6. 带您了解 O2OA 流程中的人工活动处理方式

    这次咱们来介绍 O2OA (翱途) 开发平台流程引擎中的人工活动的处理方式和逻辑,O2OA (翱途) 主要采用拖拽可视化开发的方式完成流程的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操 ...

  7. Java之引用传递

    引用传递分析 类本身就属于引用数据类型,既然是引用数据类型,就会牵扯到内存的引用传递. 引用传递的本质:同一块堆内存空间可以被不同的栈内存所指向,也可以变更指向. 引用传递案例 先看一个应用传递的例子 ...

  8. 使用 sed 处理文本文件

    前言 sed 是一款 GNU 流编辑器,可以按照指定的规则去处理文本文件或流,其强大的功能使用户在命令中快捷地修改文本文件成为可能. 它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所 ...

  9. 带你玩转 Vite + Vue3 高低版本常用玩法

    一.首先来个 Vite 的通用简介 Vite 是一种新型前端构建工具,在我们保险前端项目中已经推动并应用很久了,Vite 能够显著降低构建时间,提升前端开发效率. 它主要由两部分组成: 一个开发服务器 ...

  10. STM32外设:定时器TIM

    主要外设: TIM:Timer 定时器 TIM中的基本电路 定时器 计数器的基本功能 复位:计数器值=初值.产生一个输出脉冲.产生更新事件(UEV)脉冲.更新中断标志UIF=1 计数:计数器值递增或递 ...