直播兴起的军功章上也有你的一半——Redis实践及在直播行业的应用

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 在阿里云云栖社区举办的在线培训中,来自阿里云数据库技术组的白宸为听众带来了题为《Redis实践及在直播行业的应用》的分享,本次直播包括Redis介绍、直播行业介绍、Redis应用场景、云数据库Redis设计、云数据库Redis实践五部分。

在阿里云云栖社区举办的在线培训中,来自阿里云数据库技术组的白宸为听众带来了题为《Redis实践及在直播行业的应用》的分享,本次直播包括Redis介绍、直播行业介绍、Redis应用场景、云数据库Redis设计、云数据库Redis实践五部分。分享中他重点介绍了Redis在直播行业的应用场景,并对云数据Redis设计的原理给出了精确的解释。

以下为直播整理内容。


云数据库Redis是一种稳定可靠、性能卓越、可弹性伸缩的数据库服务;它基于飞天分布式系统和全SSD盘高性能存储,支持主备版和集群版两套高可用架构;并提供了全套的容灾切换、故障迁移、在线扩容、性能优化的数据库解决方案。

Redis介绍

4019ae2e6e0cee1cafcaddb1e2c31ca1fc62e656

Redis的全称是Remote Dictionary Server,它是由Salvatore Sanfilippo写的Key-Value存储系统。但它提供了比Key-Value更为丰富的数据结构,包括Lists、Sets、Ordered Sets以及Hashes,当然还有和Memcached一样的Strings结构;Redis当然还包括了对这些数据结构的丰富操作。Redis的优点可以总结为以下几点:

  •  性能极高,Redis能支持超过 100K+ 每秒的读写频率;
  •  丰富的数据类型,Redis支持二进制案例的 Strings、Lists、Hashes、Sets 及 Ordered Sets 数据类型操作;
  •  原子性,Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行;
  •  丰富的特性, Redis还支持 Publish/Subscribe、通知、Key过期等等特性。

41533f55bce8a4e90efd414c2da6edf16b907dca

这些丰富的特性,使得Redis在DB-Engines 排名稳居第十,其中在Key-Value数据库中排名第一。

关于直播

 

70cdcc487cc6495d9c6b6d194638de1f5d15af3f

2015年到2016年,视频直播行业异军凸起,国内涌现了一批视频直播公司,如映客、一直播、熊猫TV、花椒等。直播行业的火爆与云计算和移动互联网的关系密不可分,云计算突破了视频直播技术的门槛;移动互联网使得直播随时随地成为可能。

cb753088ea8042a62698cfaf57ed179e83bf91d8

上图是直播系统的完整框架图。用户终端,如智能手机、PAD、电脑等,通过网路接入负载均衡,进而进入后端的服务器系统;在后端服务器上,有不同的应用模块,如用户管理、关注信息、聊天交互、视频编码、金币系统、推送系统、排名系统、录像管理,这些业务系统都是搭建在底层云计算上,用户可以使用云Redis、MySQL、CDN、离线计算等资源构建直播系统。

Redis应用介绍

下面来具体介绍Redis具体应用场景。

场景一:用户信息管理

ef0bf66410a83f7f0a62215bb5303a9d9bce3db2

在直播系统中,用户有很多信息需要管理,如登录信息、注册信息等。传统的方式是采用关系型数据库存储用户信息,定义一张用户表,用户的属性对应表的列,这种方式的可扩展性很差,当用户增加新属性时,需要修改数据库中的用户表、数据订正等操作;采用Redis数据库进行用户信息管理时,通过采用Hashes数据结构,如上表所示,在user9527的个人信息中选择user9527作为Key,同时每一行的用户信息是Hashes内的Field,用户新增加信息时,通过Hset命令向Hashes内新加一个Field,如hset user9527 name xiaoqiang;最后可以通过hgetall user9527获取用户信息。

应用场景二:关注列表

3691b372ae4557474839640dd3c098fb510d8412

在直播系统中有很多关注链,如明星、游戏玩家等等。用户可以使用sets实现这类关注链,查看不同主播的关注信息。

如上图所示的Jack关注列表,通过调用sadd方法给jack_follow增加响应的value值,用户Jack多关注一个人,则多增加一个记录;同时也可以通过sadd my_follow增加我关注的列表;最后,通过sinter jack_follow my_follow得出两个关注表中的交集部分。

场景三:积分排行

bf4fc7e474a566528a8cc46991bf63dc8e82a75f

在直播系统中,需要实时更新积分排行榜,每个用户都有自己的积分和姓名信息。通过定义rank这个Key对应每个用户的积分,通过调用zadd增加对应用户的积分值,如 zadd rank 1000 Super;最后通过zrangebyscore zrank -inf +inf 遍历用户的key,得到指定范围内用户的积分,从而得到积分排行榜。

场景四:最新评论

79df37fff703e5bfaef8c923b4c06f0af7fd8499

在直播系统中,评论也是很关键的一部分,在Redis中可以通过Lists实现最新评论。如上图所示在Redis中定义latest.comment,当用户有评论时,调用Ipush增加用户的评论,如Ipush latest.comment “今天天气很好”;用户也可以调用 Irange latest.comment 0 2 获得最新评论。

除上述场景外,Redis还可以用在于:

  •  PHP session信息
  •  数据库缓存加速
  •  点赞数、评论数目,通过Incr/decr进行数目增加或减少
  •  消息广播,通过Subscribe/publish订阅模式实现
  •  附件的人,redis 3.2中新增了附近的人功能

云数据库Redis设计

 

708d5937c7d958b0baa6afe23c85b681c67760c9

Redis设计时单线程结构,进而导致了整个Redis存在性能瓶颈;另外,在单节点的场景下,机器宕机时,可用性面临着很大的问题;同时,由于Redis是全内存数据库,因此Redis内存受限于单机内存;当内存过大时,也会影响其使用情况,其可扩展性也面临着挑战。

817054d05fd1451fc125b681e0082666875ff577

为了解决上述问题,阿里云重新设计了云数据库Redis解决方案,供用户使用。目前阿里云提供了单机版和集群版两种版本的云数据库Redis产品。

f138908d13a287997bd46773b0a1f1fb73e2eebe

上图是云数据库单机架构,用户在ECS上通过SLB来访问后端的Master-Slave结构的Redis,外面的HA模块会探测Master的节点,如果Master的TCP链接无效或请求没有响应或者其他异常时,HA将调用SLB接口,将流量调至备用节点上。

原生Redis中,单节点结构不可靠;同时单线程使得慢请求阻塞,导致误判。为了解决这个问题,在Redis中新增了端口,该新端口和线程一起用于探测,对Redis实际可用性进行检查,如检查内存、CPU、进程存活情况,避免由于慢请求阻塞导致误切换的情况发生。

 

43f3ebfe145c7ef8be3bcbf29d24517030a803ce

上图是云数据库集群架构,ECS通过负载均衡访问后端的PROXY;PROXY根据路由表访问后端的Master-Slave结构;Config Server用于维护路由表的关系,在扩容时,用于维护两个路由表的变化;数据迁移通过Config Server促发Redis Server,PROXY链路根据路由表和后端Redis Server反馈情况,来访问迁移中的数据。整个集群同单机版类似,采用双备份架构,同时整个链路部署了全链路监控;此外还支持动态扩容和自动容灾。

用户并不希望在链路升级时出现闪断情况,因此云数据热升级机制就显得尤为重要。目前云数据库支持Proxy热升级和Redis热升级。

53472857f72c7decca76f1f56f04cbb23190e955

对于Proxy热升级,通过unix domain socket把所有TCP连接迁移到New proxy进程,迁移过程中,用户是无感知的,也不会发生闪断现象;所有的Client TCP链接都迁移到New Proxy进程上,再把Old Proxy进程关闭,完成升级。

 

 

e27b738783b0a455c0b635efc687424f95818bef

对于后端的Redis热升级,将Redis进行拆分二进制文件和动态库SO,在升级过程中调用SO中的函数,将老版本内的SO信息复制到新版本SO中,最后释放旧版本中的数据。整个升级过程用户是无感知的,升级时间短,一次升级花费4毫秒。

ad36c934e8e8727ab93af6b2aa2dd5d12413ed88

接下来看下Redis中内核存储优化,原生Redis中有两种持久化方式:RDB和AOF。其中RDB是时间点的备份,用户可以通过两种方式出发RDB的备份;AOF的方式类似MySQL的Binlog,可以通过对AOF文件进行追加。从上图可以看出,这两种持久化方式存在Fork耗时、AOF阻塞请求、大IO影响稳定性的痛点。

对于访问量比较高,延迟要求低的数据库来说,这些问题必须加以解决。通过对Redis内核存储进行了优化,采取RDB加AOF的方式,其中AOF按照大小回滚,废弃AOF Rewrite过程;同时将AOF写入放到后台生成进行写入,在可运维时间内进行全量的写操作。

6ce623bed05a365e0d85be15c7430da3f24eef47

目前云数据Redis支持全量备份和基于时间点恢复备份,后者尚未在公有云上线。全量备份目前是按天级别的备份,整个备份过程由Backup Server进行管理。Backup Server通过访问元数据库获取信息,通过communicator下发任务给每个DB节点上的Backup Agent;Backup Agent接到任务后,通知Redis Server进行全量备份,将备份文件流式化上传到OSS上。在备份恢复时,Backup Agent从OSS上拉取备份文件,下载到本地;DBNode通过加载文件恢复之前备份的数据。整个备份恢复系统增加系统的可靠性,用户可以在数据丢失的情况下,通过数据恢复找到之前的数据。

云数据Redis运维监控体系主要包括:主机监控、网络监控、实例监控、可用性监控和巡检系统。

6f4282bd15ae5d3725c2683d1b0d11cc356182bb

上图是主机监控效果图,从图上可以主要记录了CPU TOP进程、每个进程的CPU消耗、用户态的CPU和系统态的CPU以及磁盘I/O、读写等信息。

1caf1712e5964d05e355ac1c7290059cfe6739fc

网络监控主要是通过在协议栈上抓取信息,统计实例级别的流量和链接信息、网络质量,查看是否存在丢包、乱序重传、异常关闭等信息。实例监控主要监控实例的访问量、流量、消耗的CPU、内存、磁盘IO、命令情况、慢请求等。 

云数据库Redis实践

ea4a5501449c2bb8ea1b5420370e5911c9839633

用户在选择云数据库Redis时,需要注意以下几点:

  •  可用区选择,跨机房延迟比同机房高,因此需要尽量选择同机房;
  •  网络类型,目前阿里云提供两种网络类型:经典网络和专有网络,企业应根据对应的业务类型选择合适的网络类型。
  •  容量评估,容量受限于内存大小,企业根据业务需求选择对应的内存。
  •  计算评估,目前单机版最大是10wqps,集群版本是60-100wqps,企业需要较大的计算能力时,应选择集群版本。

云数据库Redis不同规格的存储容量、最大连接数、吞吐量都有限制,具体参数如上图所示。

在使用Redis过程中,总结了一些最佳实践:

  •  使用长连接,避免短连接风暴,因为短连接需要建立链接、鉴权等步骤,性能远不如长连接;
  •  使用时避免使用keys*命令,如需获取所有的Key,可以通过Scan代替,这是由于keys *容易阻塞所有的命令,导致CPU占满,出现超时现象;
  •  在使用时,如果发现后端Redis Server运行缓慢,可以通过Slowlog命令分析Redis运行情况;
  •  用户也可以通过设置过期时间,让缓存占用的内存尽快释放;
  •  对于持久化的存储,使用时应尽量避免内存大量淘汰;
  •  在使用Redis还使用云监控提前发现性能及容量瓶颈;

此外,用户还可以通过控制台进行历史监控,设置合理的备份时间以及使用DMS查看实时信息。

关于分享者:

白宸,14年加入阿里巴巴,早期在淘宝核心系统负责分布式缓存开发工作;后并入阿里云数据库技术组,专注于云数据Redis设计研发工作。


相关云产品:

云数据库 Redis 版本:https://www.aliyun.com/product/kvstore


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
15天前
|
存储 消息中间件 NoSQL
Redis数据类型详解:选择合适的数据结构优化你的应用
Redis数据类型详解:选择合适的数据结构优化你的应用
|
2月前
|
存储 缓存 NoSQL
蚂蚁金服P7私藏的Redis原理与实践内部笔记
Redis 是完全开源免费的,是一个高性能的key-value类型的内存数据库。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
59 1
|
3月前
|
存储 NoSQL 安全
Redis相关命令详解及其原理:Redis基本操作、数据结构以及应用
Redis相关命令详解及其原理:Redis基本操作、数据结构以及应用
89 0
|
2月前
|
消息中间件 NoSQL Java
Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】
Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】
186 1
|
26天前
|
Cloud Native NoSQL 数据管理
Serverless 应用引擎常见问题之首次启动获取不到redis连接如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
28 3
Serverless 应用引擎常见问题之首次启动获取不到redis连接如何解决
|
1月前
|
存储 缓存 NoSQL
探索Redis的多样应用场景:加速和优化现代应用
探索Redis的多样应用场景:加速和优化现代应用
33 2
|
1月前
|
存储 消息中间件 NoSQL
Redis 常见数据类型(对象类型)和应用案列
接下来,让我们走进 Redis 的对象世界,Redis 5.0版本就已经支持了下面的 9 种类型,分别是 :字符串对象、列表对象、哈希对象、集合对象、有序集合对象、Bitmaps 对象、HyperLogLog 对象、Geospatial 对象、Stream对象。
Redis 常见数据类型(对象类型)和应用案列
|
1月前
|
弹性计算 NoSQL 测试技术
倚天使用|Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
137500 3
|
1月前
|
缓存 NoSQL 安全
【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】
【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】
48 0
|
3月前
|
NoSQL 安全 Redis
解决秒杀系统库存超卖问题:乐观锁与Redis分布式锁的应用
解决秒杀系统库存超卖问题:乐观锁与Redis分布式锁的应用
385 0

热门文章

最新文章