写点什么

Redis5.0 之 Stream 案例应用解读

  • 2019-10-23
  • 本文字数:3470 字

    阅读完需:约 11 分钟

Redis5.0之Stream案例应用解读

大家好,我是本次直播的讲师 Pick。非常高兴有机会和大家在这里交流 Redis5.0 之 Stream 应用。今天的分享更多的是一个抛砖引玉,欢迎大家提出更多关于 Redis 的思考。


我们来个假设,这里有个杯子,这个杯子是去年我老婆送的,送的原因是我以前的杯子保温性能太好,导致我很少能喝上水,而这样敞口的杯子能促使我多喝水。虽然这杯子在商家的货架上只是千千万万只杯子中的一只,但是它对我来说仍然是不同的。不同的是过往,是记忆。这记忆说起来是数据的一类,这类数据也让我们生活更美好。



这种数据的特点是什么呢?产生是一次产生的,但是我们会希望经常看到,希望将这种美好填充到各种东西中。而杯子本身也可以说是一个生产-消费模型:数据出现,然后被各种消费。



消费的一种情况


因此,杯子不仅仅是一个杯子,实际上背后的可挖掘的东西非常多。意义越多,连接越多,关系越复杂,我们数据量也越大,所以,希望价值最大化的我们,就产生了大量希望被高速处理的数据,这数据体现在系统上,往往就成了数据洪峰,成了系统难以承受之重。


在很多情况下,我们采集端所包含的信息可能远远超出这个数值。例如,雾霾天里,我们的房间,我们的位置,它的空气质量是怎样的,各项污染物参数是多少?我们这个办公区,这栋楼,这个房间的空气质量又是怎样的,电力消耗是怎样的,行人状况,车辆数据,等等。上亿的数据,涉及互联互通,需要保证高并发可靠传输。同时数据收集上来后要进行处理和存储、分析,对系统的挑战都是巨大的。


巨大的、网状的互联互通,需要带宽巨大、顺畅的管道;这么多的数据,会形成巨大的数据洪流,采集完成后在云端进行分析,也可以产生巨大的用户价值。



区域检测监控


这些数据虽然形式各不相同,但是也有共同的特点,就是和时间有关。例如,一户人家,从主卧到书房,从客厅到餐厅,不同的房间不同的位置放置一些空气监测仪,监测仪里面的化学药剂接触空气中的各种成分,随时间缓慢变化,变化过程中产生信号,这些信号经过初步整理计算,形成一个平面的空气质量数据;从清晨到傍晚,从春到秋,不同的时间点,甲醛、TVOC 等各种污染物成分的数值也不一样,因此平面的数据在这里形成了时序数据。


凑巧的是,Redis 的流就是专门为时序数据设计的。我们回顾一下 Redis 的流的存储设计:主线是一个消息链表,将所有消息按照顺序串起来。因此 Redis 的流在这方面支持度是非常不错的,我们可以将平面内的数据按照时间序列加入到 Redis 流里面。当然这些数据我们可能需要初步处理,因此我们也可以使用 Redis 的其它数据结构,例如 list,再凭借 Redis 对 Lua 脚本的支持,用很少的外部应用逻辑驱动它完成处理。这处理因为是在 Redis 内部完成,所以整体上来说,计算消耗是比较低的。Redis 原本凭借它原生 C 的优势,还有内存实现和数据结构的优化,内存占用就比较小,CPU 要求也低,使它在小型设备上高效率的运行成为可能。未来可能会有万亿级的智能设备基于 ARM 平台,前景还是非常广阔的。


所以从设备端,我们已经可以使用 Redis 来完成数据的临时存储和基本的处理,加入 Redis 流后,再使用 MQTT、TCP、808 等协议,通过网络上传数据。通常我们需要采集的区域会比较广,设备数量很多,因此数据也比较多,那数据可能还需要在局部,进行初步的汇总处理。这里数据洪峰往往就开始显露了。如果我们期望保存进 mysql 等数据库,通常是顶不住压力的。因为数据库的原子性、一致性、隔离性、持久性等,对性能的损耗是比较大的。所以这里我们可以使用 Redis 来接收洪峰监测数据,然后分发给存储服务、处理服务、展示服务,等等。在分发处理完成前,Redis 本身作为高速内存存储,流里面的数据也是可以作为普通的缓存数据,被反复访问的,所以也在一定程度上,对消息消费前的空档期,做了补充,也给予了后台更宽裕一些的处理时间。


我们来回顾一下其中 Redis 的使用:快,Redis 的性能很高;小,轻便简洁,对内存和 CPU 要求小;丰富,数据结构丰富,用法多样;时序,流是为时序应用设计的;支持 Lua 脚本,能自定义逻辑。


饭要一口一口吃,路得一步一步走。让我们回到技术本身,从巨大的洪流里截取出一部分和 Redis 有关的,还原成基本的工作流程。



我这里截取的是空气监测的存储和处理。我们来看一下示意图,仪器上报数据,Redis 接收数据流,并且提供给存储、分析消费,同时供应用使用。



检测数据产生,组别建立


首先来了一条空气数据,检测数据产生,存储、分析消费组也建立起来了。空气数据包含了 hcho 和 tvoc 污染物值。我们看看命令,这里有个 maxlen,这是为了避免队列过长,所以设置的最大长度。为什么需要这么设置呢?因为 Redis 的流顺序消费后,甚至 xdel 后,数据并不会被清理,队列会越来越长,所以这里我们设置个最大长度,避免溢出。


这里有两个存储服务。假设存储相对比较慢,为了能及时处理,我们构建了更多的存储服务。


我们看看存储和分析服务消费数据的过程。这里两个存储服务都尝试获取数据,但是很明显,只有一个获取到了数据进行处理。分析在这时尝试取 3 条数据加入分析处理,但是因为 stream 里只有 1 条,所以这里只取到 1 条。



存储、分析服务消费数据


分析服务率先完成了数据的消费,所以在分析服务里马上答复了一个 ack 给 stream,告诉它,已经消费完成了。随后存储服务也完成了存储,存储服务也发送了个 ack 给 stream。



消费完成,答复 ACK


分析服务刚刚答复完 ack,因为某些原因,重启了。分析服务启动的时候,不清楚消费到哪里了,所以尝试从初始位置开始消费。这里因为前面已经消费过并且返回了 ack,所以没有取到任何可消费的数据。如果有数据没消费完成的,通过这种方式可以进行再次消费,所以服务在消费时需要能够处理重入。



分析服务重启,开头消费起


在这里我们看到,检测数据也在不停地到来,存储和分析服务同样按照前面的规则消费。分析服务按照自己的能力,依然尝试一次取用 3 条,根据结果我们可以看到,这次分析服务取到了两条消费数据。



新检测数据



分析服务消费数据


存储服务呢?两个存储服务也都取到了数据进行消费。



存储服务消费数据


这时候用户开始访问应用了,他打算看下污染情况是怎样的。我们都能理解,刚刚购买一件新东西的时候,我们会更倾向于马上看看,所以这里用户肯定是期望看到污染物情况的。但是这时数据既没有分析完毕,也没有存储完毕,我们需要怎么处理呢?


应用服务可以先检测状态,发现需要的数据还没有处理完成,因此从常规缓存里面获取明显是获取不到的。所以应用直接从 stream 里获取了,我们可以看到,用户顺利地秒看到了监测数值,对身边的状况马上有了一个了解。用户想看看还有没有新数据,所以在应用上点了下刷新,我们看到,这次仍然能从 stream 中获取到需要的数据。当然,如果用户想针对性地看看情况,应用中也可以指定 ID 读取。那还有没有其它方式呢?xrange 也是批量取出需要消息的一种方法。



应用使用 xread 方式读取数据



应用使用 xrange 方式截取数据


从这里可以感受到,虽然我们的日子,在时间的流里面一往无前,一去不返了,但幸运的是,在 Redis 的流里面,我们仍然可以从过往里截取出任意一段,重新品尝,温故知新。


回到例子。用户刷完两次后,存储和分析服务处理好数据了,所以存储和分析服务再次向 stream 发送 ack 消息,示意已经处理完成。



消费完毕,返回 ack


当然,这些 Redis 里面的处理,都是一如既往地高性能、高效的。


这里只是一个简单的截面,一个示意。实际上,Redis 原本的使用场景就非常丰富,例如,作为会话缓存,作为页面的全页缓存,手机或者网页的验证码,服务访问的频率限制,密码防暴力破解,竞技场、吃鸡、短视频女神榜等各种排行榜,点赞、阅读数等计数器和排行,关注某个标签、或者某个明星的人,限时优惠活动,证券的实时指标计算,号码发放器,甚至还有 geo 地理信息,基于 LUA 的自定义逻辑,还有订阅发布,等等,非常丰富。这些都是基于 Redis 丰富的数据结构,开发出来的使用方式。


罗胖在时间的朋友演讲说,大趋势往往不是一个小趋势逐步成长起来的,而是趋势撞击趋势,改变带来改变,逐渐滚动、交织变大的。那么 Redis 的流,能在这些已经存在的应用场景里,提供怎样的碰撞?又能在新的领域里,带来怎样的趋势?欢迎大家前来共同讨论。


也欢迎大家到华为云分布式缓存免费领取 Redis 5.0。现在 Redis 5.0 是公测阶段,可以免费体验。领取也非常简单,申请公测,然后花费几秒创建 Redis 5.0 实例,就可以了。



更多不一样的用法,欢迎大家在下方留言与我一起探讨。


本文转载自公众号中间件小哥(ID:huawei_kevin)。


原文链接:


https://mp.weixin.qq.com/s/7YZXS6XB_nMcGtlu-p37eg


2019-10-23 11:391000

评论

发布
暂无评论
发现更多内容

电信及互联网行业数据安全内控审计建设实践 | 盾见

极盾科技

数据安全

权威学者、企业CFO荟聚上海国家会计学院,共探「智能会计 价值财务」

用友BIP

智能会计 价值财务 用友智能财务 业财融合

浅谈测试用例设计 | 京东云技术团队

京东科技开发者

测试 测试用例 测试用例设计 企业号 4 月 PK 榜

校企共建|阿里云与西安电子科技大学人才培养交流会顺利举行

云布道师

校企合作

自动化回归测试平台 AREX 0.2.8 版本正式发布!

AREX 中文社区

自动化测试 接口测试 回归测试

iSulad+Kuasar:管理面资源消耗锐减 99%的新一代统一容器运行时解决方案

openEuler

Linux 容器 云原生 操作系统 Kubernetes Serverless

分布式计算技术(下):Impala、Apache Flink、星环Slipstream

星环科技

分布式计算 Slipstream

用友iuap 让企业数智化能力深入、让业务价值浅出

用友BIP

用友 用友iuap 用友技术大会 数智底座

戴尔科技园动力计划,携手中南高科赋能中小企业数字化转型

科技热闻

Rust-Shyper:基于 Rust 语言的高可靠、开源嵌入式 Hypervisor

openEuler

Linux rust 操作系统 虚拟机 嵌入式

从入门到精通,超详细的程序员Java学习路线指南

Java你猿哥

Java 数据库 Web ssm 死磕 Java 基础

分布式存储技术(下):宽表存储与全文搜索引擎的架构原理、特性、优缺点解析

星环科技

分布式 全文搜索

竞争焦点转向数智底座 用友能否再引领

用友BIP

用友iuap 用友技术大会 升级企业数智化底座

分布式场景下,Apache YARN、Google Kubernetes 如何解决资源管理问题?

星环科技

资源管理 Apache YARN

如何在微服务下保证事务的一致性 | 京东云技术团队

京东科技开发者

架构 微服务 事务 一致性 企业号 4 月 PK 榜

SysCare:为您的操作系统保驾护航

openEuler

Linux 操作系统 openEuler 内核 热补丁

数栈V6.0全新产品矩阵发布,数据底座 EasyMR 焕新升级

袋鼠云数栈

大数据 基础软件 数字化转型

阿里十年资深码农共享SpringCloud微服务架构实战文档

Java你猿哥

微服务架构 Spring Cloud ssm 架构设计 架构师

代码重构:面向单元测试

阿里技术

基于公共信箱的全量消息实现

百度Geek说

大数据 即时通讯 企业号 4 月 PK 榜 公共信箱

分布式存储技术(上):HDFS 与 Ceph的架构原理、特性、优缺点解析

星环科技

hdfs 分布式存储 Ceph

这一秒,困扰了程序员 50 年!

Java你猿哥

Java 程序员 ssm 计算机

Github星标120k!这份阿里独有的高并发实战笔记太强了!

Java redis zookeeper Netty 高并发

硬核!阿里P8耗时6月打造的架构师速成手册,颠覆你对架构师的认知

Java你猿哥

架构 分布式 ssm 软件架构 架构师

分布式技术剖析

星环科技

分布式

分布式计算技术(上):经典计算框架MapReduce、Spark 解析

星环科技

分布式计算

星环科技自研技术,加速大数据从持久化、统一化、资产化、业务化到生态化

星环科技

大数据

企业数据平台建设的基石:构建统一的数据存算能力

星环科技

存算能力

如何创造数据资产价值?如何对内赋能业务运营,对外创造市场价值?

星环科技

数据资产 数据要素流通

度量分析开源社区健康度,助力企业开源生态健康发展——华为开源管理中心王晔晖

开源雨林

开源治理 OSPO OSS Compass CHAOSS

MySQL8.0.32的安装与配置

Java你猿哥

Java MySQL ssm Java工程师

Redis5.0之Stream案例应用解读_文化 & 方法_Pick_InfoQ精选文章