当前位置: 首页 > 编程日记 > 正文

Redis5.0之Stream案例应用解读

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

非常高兴有机会和大家在这里交流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实例,就可以了。

转载于:https://my.oschina.net/u/3857802/blog/3002581

相关文章:

往阿里云服务器上安装Mysql

在安装完Mysql后要进行登录,这时候显示让你输密码, 我点击键盘发现怎么没有密码出现, 然后我就把Mysql卸载了重新装的,折腾了2个多小时, 最后,我突然想试试直接输密码然后就回车, 发现成功进入数…

PHP中spl_autoload_register函数的用法

spl_autoload_register(PHP 5 > 5.1.2)spl_autoload_register — 注册__autoload()函数说明bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。如果在你的程序中已经实现…

Linux初步——常用简单命令

散乱的记录,目前是边学边用,以后有机会再整理 curl命令 发起一个HTTP请求,如:curl "http://www.baidu.com" 加上-I选项查看HTTP协议头的信息,如:curl "http://www.baidu.com" -I Linux…

Centos-Mysql配置my.cnf内容

#v1.0 [mysqld] #通用 #skip-grant-tables 跳过授权密码登录 port3306 #使用mysql系统账号操作进程 usermysql socket/var/lib/mysql/mysql.sock #basedir/usr datadir/var/lib/mysql #mysql错误日志 log_error /tmp/ch_mysql_log/error.log #mysql所有操作日志 生产服务器不…

本地navicat连接阿里云数据库

自己起连接名字; prot:填公网IP(服务器给的) password:填阿里云数据库的密码

adb logcat命令查看并过滤android输出log

adb logcat命令查看并过滤android输出log cmd命令行中使用adb logcat命令查看android系统和应用的log,dos窗口按ctrlc中断输出log记录。 logcat日志中的优先级/tag标记: android输出的每一条日志都有一个标记和优先级与其关联。 优先级是下面的字符&…

重读TCP协议(3)

重读TCP协议(3) TCP 的数据流TCP的数据流大致可以分为两类,交互数据流与成块的数据流。交互数据流就是发送控制命令的数据流,比如relogin,telnet,ftp命令等等;成块数据流是用来发送数据的包&…

拥有2000家门店,他如何晋升为服装界的新宠?

—— iwarm3.0加热组件、碳纳米管膜炎、管状石墨结构体...你看到并不是一款高科技电子产品,这是快鱼服饰在这个冬天推出的黑科技产品 - 智能温控羽绒服。 在竞争激烈的服装行业,快鱼(Fast Fish)将“快时尚”的理念推广至全国&…

navicat连接云数据库报错2003,2005

一开始报2003,好吧,是Mysql挂掉了, 然后重启Mysql服务 systemctl restart mysqld.service #重启 mysql然后再连接,报错2005, 好吧,是复制ip的时候多了一个空格,再输入一次即可 我服了。

基础学习总结(四)--SQLite

1. SQLiteDatabase操作SQLite数据库的类。可以执行SQL语句,对数据库进行增、删、查、改的操作。也可以进行transaction的控制。很多类对数据库的操作最终都是通过SQLiteDatabase实例来调用执行的。需要注意的是,数据库对于一个应用来说是私有的&#xff…

用node实现websocket协议

协议 WebSocket是一种基于TCP之上的客户端与服务器全双工通讯的协议,它在HTML5中被定义,也是新一代webapp的基础规范之一。 它突破了早先的AJAX的限制,关键在于实时性,服务器可以主动推送内容 到客户端!可能的应用有&a…

反向春运成为新趋势 客流年增9%

资料图:春运。殷立勤 摄 中新社北京1月18日电 (记者 周音)近年来,反向春运成为新趋势。中国铁路总公司18日披露,反向春运客流以年增9%左右的速度增长。 传统春运是大城市返乡回家过年。反向春运是年轻人选择将老家的父母和孩子接来自己工作的…

把.sql文件上传到服务器上

使用xftp工具,在root文件夹下新建myProject文件夹,然后把.sql文件拖拽过去即可。 进入xshell, 进入到mysql: mysql -u root -p输入密码: create database 数据库名;use 数据库名;source ~/新…

最先进的开源游戏引擎KlayGE 3.12.0发布

转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2011/06/30/%e6%9c%80%e5%85%88%e8%bf%9b%e7%9a%84%e5%bc%80%e6%ba%90%e6%b8%b8%e6%88%8f%e5%bc%95%e6%93%8eklayge-3-12-0%e5%8f%91%e5%b8%83/ KlayGE 3.12.0在上半年的最后一天发布了&#xff01…

如何防止博客文章被窃取

写文章的优点: 1.整理自己的学习过程,思想心得。 2.看到自己的文章被别人转载了,心理愉悦,说明作者写的文章有价值,可以帮助他人。 缺点: 1.花费时间和精力。 2.说是抄袭别人。明明自己是原创,别…

js中的装饰器执行顺序

/*** 执行顺讯* [(property)...]->[(parameter->method)...]->constructor->class* [属性...]->[((方法参数...)->方法)...]->[constructor...]->class* 声明周期 property|parameter|method|constructor|class* 声明周期 [始化完毕]init->[属性添加…

关于springboot vue前后端分离项目部署到阿里云轻量服务器(前后端分开部署)

0.购买阿里云服务器 1.安装jdk 使用yml安装 2.安装mysql 3.安装nginx 4.打包后端项目 后端项目更改: 在pom.xml文件中,增加打包成jar包的配置文件 application.properties配置文件中更改数据库信息,端口号:(所使…

.NET泛型解析(下)

上一篇对.NET中的泛型进行了详细的介绍以及使用泛型的好处是什么,这篇将更加深入的去了解泛型的其他的知识点,重头戏. 【1】泛型方法 上一篇我们也说过了,泛型可以是类,结构,接口,在这些泛型类型中定义的方法都可以叫做泛型方法,都可以引用由泛型类型本身指定的一个类型参数例如…

spark集群使用hanlp进行分布式分词操作说明

本篇分享一个使用hanlp分词的操作小案例,即在spark集群中使用hanlp完成分布式分词的操作,文章整理自【qq_33872191】的博客,感谢分享!以下为全文:分两步:第一步:实现hankcs.hanlp/corpus.io.IIO…

让VirtualBox的虚拟机器在电脑开机时自动启动

当你安装很多套Virtualbox的虚拟机器系统后,希望能在开机后自动启动虚拟机器的系统。 Linux (Host OS):在你的/etc/rc.local中加入下列几行VBoxVRDP -startvm WinXP & VBoxVRDP -startvm Win2003 & VBoxVRDP -startvm LinuxFC6 & Windows (Host OS): 开…

L1-025 正整数A+B

不确定的点: 1.数据用什么类型输入,如果用字符串类型输入,怎么判断它是不是正整数 2.怎么判断哪部分是A,哪部分是B 解析 c语言’\0’ 意思: 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节…

制作显示欢迎信息的脚本程序

终端程序恐怕是Linux用户使用最为频繁的了。我的Debian系统启动后便是直接进入的终端界面。为了在每次登录时或者是在X视窗环境下打开终端程序时显示一些欢迎信息,比如当前的日期、名人警句等,从而可以增加一些生活情趣,就可以创建一个脚本程…

文章分页浏览(二)

分页的方法: View Code publicstringOutputBySize(stringp_strContent, stringbType) { stringm_strRet ""; intm_intPageSize 500;//文章每页大小 intm_intCurrentPage 1;//设置第一页为初始页 intm_intTotalPage 0; intm_intArticlelengt…

云计算时代,如何选择适合自己的云服务器厂商?

据百科定义,云服务器是一种处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,降低开发运维的难度和整体IT成本,使您能够更专注于核心业务的创新。云服务器相对传统服务器有些优势:按国内市场上云服务器…

解决mysql建立的数据库名字不能带大写字母

1、在安装目录下,找到 my.ini文件 2、找到 [mysqId]节点 3、在它下面添加 lower_case_table_names2如果设置为0的话,我的Mysql服务不能重启 4、重启Mysql 直接手动重启即可,在服务中,找到Mysql服务,先停止&#xff0c…

CSS position财产

CSS在position位置信息要素用于表示属性。 有三个起飞值:static, absolute, relative。假设元件不显式配置position财产,该元素默认position 值至static。 1、static:这是表示该元素依照排列和嵌套的顺序和规则应该在的位置,此时设…

通过产品ID得到collection!!!

You can do as following for filtering products id 10 and 12$products->addAttributeToFilter(entity_id, array(in>array(10,12)));当然这种方式的上面,必须用 ->addAttributeToSelect();下面这种方式比较实用的,如果想按照名字排序&#…

jupyter notebook出现cannot import name 'create_prompt_application'问题(Died Kernel)

应该是在安装其它python第三方库时更新了prompt-toolkit版本,降级到下面的版本即可: sudo pip install prompt-toolkit1.0.15 转载于:https://www.cnblogs.com/darklights/p/10302706.html

导入sql时出现Invalid default value for ‘create_time‘报错处理方法

(上图是初始的sql文件的内容) 在开发微信小程序时,需要导入.sql文件,但是最一开始导入的时候没有任何改动进行了导入,报错如下 PS E:\weichatApp\my-project\server> node tools/initdb.js 开始初始化数据库... 准…

Python相关机器学习

Python机器学习库 Python的机器学习库汇总与梳理 机器学习之开源库大总结 转载于:https://www.cnblogs.com/SFMing/p/4590261.html