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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 在阿里云云栖社区举办的在线培训中,来自阿里云数据库技术组的白宸为听众带来了题为《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
相关文章
|
1月前
|
存储 缓存 NoSQL
深入理解Django与Redis的集成实践
深入理解Django与Redis的集成实践
60 0
|
3月前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
76 0
|
7天前
|
监控 NoSQL 网络协议
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
|
24天前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
132 22
|
29天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
75 9
|
1月前
|
存储 消息中间件 NoSQL
【redis】redis的特性和主要应用场景
【redis】redis的特性和主要应用场景
110 1
|
3月前
|
Kubernetes NoSQL Redis
【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis server
【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis server
【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis server
|
2月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
3月前
|
NoSQL Java Redis
Spring Boot集成Redis全攻略:高效数据存取,打造性能飞跃的Java微服务应用!
【8月更文挑战第3天】Spring Boot是备受欢迎的微服务框架,以其快速开发与轻量特性著称。结合高性能键值数据库Redis,可显著增强应用性能。集成步骤包括:添加`spring-boot-starter-data-redis`依赖,配置Redis服务器参数,注入`RedisTemplate`或`StringRedisTemplate`进行数据操作。这种集成方案适用于缓存、高并发等场景,有效提升数据处理效率。
509 2
|
3月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection refused)的排查步骤
【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection refused)的排查步骤
下一篇
无影云桌面