摘要:本文将对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有良好的设计初衷,然而并不能解决理论问题。具体体现在:
- 无奈有效应对大规模数据:原生Redis是一个基于内存的数据库,单个节点存储容量无限,当扩大至TB级别的集群,将会呈现治理艰难,运维老本低等问题。
- 集群扩容影响业务性能:原生Redis在进行集群扩容时,须要从新划分hash槽并进行数据迁徙,必定会影响业务性能。
- 数据可能会失落:原生Redis尽管能够采纳RDB和AOF的形式对数据进行长久化,然而并不会实时地将每一条命令写入到硬盘中,当呈现掉电或集群解体的状况,必定会失落一部分数据,对于相似智慧医疗场景,是难以忍受的。
除此以外,必须思考数据库系统的可用性、数据一致性、老本和备份恢复能力等状况:
- 可用性: 原生Redis若采纳一主一备的集群模式,当一对主备节点下线,集群局部数据将不可用。
- 数据一致性:当主节点宕机,主备节点切换,数据存在没有齐全同步的状况。
- 老本:原生Redis是一种内存型数据库,当内存容量扩大至TB级别,老本将十分低廉。
- 备份复原:须要人工连贯数据库执行 SAVE或BGSAVE命令,不能反对定期主动备份,在复原到新实例时须要手动拷贝备份数据。
四、是否有更好的解决方案?
在以上场景中,亟需一种可能存储和解决大规模Stream数据、鲁棒性强、且老本低廉的数据库系统。而GaussDB(for Redis)(下文简称高斯Redis)正是以上场景中一种很好的利用解决方案。高斯Redis是华为云数据库团队自主研发的兼容Redis协定的云原生数据库,该数据库冲破原生Redis的内存限度,可轻松扩大至PB级存储,具备秒扩容、超可用、强统一和低成本等特点。
五、总结
Redis Stream能够广泛应用在即时通讯、智慧医疗、流量削峰等畛域。在面对大规模的Stream数据时,原生Redis存在老本过高、容量太小、可用性差、数据不统一等问题,无奈实用于海量音讯队列的场景。与原生Redis相比,高斯Redis具备海量存储,低成本,可长久化等长处,可做为比原生Redis更现实的Stream队列承载计划。
附:参考资料
- 《华为云GaussDB(for Redis)与自建开源Redis的老本比照》
www.modb.pro/db/42739
- 《一场由fork引发的超时,让咱们从新探讨了Redis的抖动问题》
bbs.huaweicloud.com/blogs/22752…
- 《当Redis遇见计算存储拆散》
developer.huaweicloud.com/hero/forum/…
- 《GaussDB(for Redis)与原生Redis的性能比照》
bbs.huaweicloud.com/blogs/23694…
- 《华为云PB级数据库GaussDB(for Redis)揭秘第一期:Redis与存算拆散》
bbs.huaweicloud.com/blogs/23858…
点击关注,第一工夫理解华为云陈腐技术~