浅谈Redis在直播场景的实践方案


Posted in Redis onApril 27, 2021

背景信息

视频直播间作为直播系统对外的表现形式,是整个系统的核心之一。除了视频直播窗口外,直播间的在线用户、礼物、评论、点赞、排行榜等数据信息时效性高,互动性强,对系统时延有着非常高的要求,非常适合使用Redis缓存服务来处理。
本篇最佳实践将向您展示使用Redis版搭建视频直播间信息系统的示例。您将了解三类信息的构建方法:

  • 实时排行类信息
  • 计数类信息
  • 时间线信息

实时排行类信息

实时排行类信息包含直播间在线用户列表、各种礼物的排行榜、弹幕消息(类似于按消息维度排序的消息排行榜)等,适合使用Redis中的有序集合(sorted set)结构进行存储。
Redis集合使用空值散列表(hash table)实现,因此对集合的增删改查操作的时间复杂度都是O(1)。有序集合中的每个成员都关联一个分数(score),可以方便地实现排序等操作。下面以增加和返回弹幕消息为例对有序集合在直播间信息系统中的实际运用进行说明。

以unix timestamp+毫秒数为分值,记录user55的直播间增加的5条弹幕:

redis> ZADD user55:_danmu 1523959031601166 message111111111111
(integer) 1
11.160.24.14:3003> ZADD user55:_danmu 1523959031601266 message222222222222
(integer) 1
11.160.24.14:3003> ZADD user55:_danmu 1523959088894232 message33333
(integer) 1
11.160.24.14:3003> ZADD user55:_danmu 1523959090390160 message444444
(integer) 1
11.160.24.14:3003> ZADD user55:_danmu 1523959092951218 message5555
(integer) 1

返回最新的3条弹幕信息:

redis> ZREVRANGEBYSCORE user55:_danmu +inf -inf LIMIT 0 3
1) "message5555"
2) "message444444"
3) "message33333"

返回指定时间段内的3条弹幕信息:

redis> ZREVRANGEBYSCORE user55:_danmu 1523959088894232 -inf LIMIT 0 3
1) "message33333"
2) "message222222222222"
3) "message111111111111"

计数类信息

计数类信息以用户相关数据为例,有未读消息数、关注数、粉丝数、经验值等等。这类消息适合以Redis中的散列(hash)结构进行存储。比如关注数可以用如下的方法处理:

redis> HSET user:55 follower 5
(integer) 1
redis> HINCRBY user:55 follower 1 //关注数+1
(integer) 6 
redis> HGETALL user:55
1) "follow"
2) "6"

时间线信息

时间线信息是以时间为维度的信息列表,典型有主播动态、新帖等。这类信息是按照固定的时间顺序排列,可以使用列表(list)或者有序列表来存储,示例如下:

redis> LPUSH user:55_recent_activitiy  '{datetime:201804112010,type:publish,title:开播啦,content:加油}'
(integer) 1
redis> LPUSH user:55_recent_activitiy '{datetime:201804131910,type:publish,title:请假,content:抱歉,今天有事鸽一天}'
(integer) 2
redis> LRANGE user:55_recent_activitiy 0 10
1) "{datetime:201804131910,type:publish,title:\xe8\xaf\xb7\xe5\x81\x87\",content:\xe6\x8a\xb1\xe6\xad\x89\xef\xbc\x8c\xe4\xbb\x8a\xe5\xa4\xa9\xe6\x9c\x89\xe4\xba\x8b\xe9\xb8\xbd\xe4\xb8\x80\xe5\xa4\xa9}"
2) "{datetime:201804112010,type:publish,title:\xe5\xbc\x80\xe6\x92\xad\xe5\x95\xa6,content:\xe5\x8a\xa0\xe6\xb2\xb9}"

到此这篇关于浅谈Redis在直播场景的实践方案的文章就介绍到这了,更多相关Redis 直播场景实践内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Redis 相关文章推荐
详解Redis基本命令与使用场景
Jun 01 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
redis requires ruby version2.2.2的解决方案
Jul 15 Redis
Redis做数据持久化的解决方案及底层原理
Jul 15 Redis
Redis Cluster 集群搭建你会吗
Aug 04 Redis
Redis入门教程详解
Aug 30 Redis
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 Redis
Redis数据同步之redis shake的实现方法
Apr 21 Redis
浅谈Redis缓冲区机制
Jun 05 Redis
Redis实现分布式锁的五种方法详解
Jun 14 Redis
Redis Lua脚本实现ip限流示例
Jul 15 Redis
redis限流的实际应用
Apr 24 #Redis
Redis安装启动及常见数据类型
redis配置文件中常用配置详解
Apr 14 #Redis
Redis遍历所有key的两个命令(KEYS 和 SCAN)
Apr 12 #Redis
浅谈redis五大数据结构和使用场景
Redis如何一键部署脚本
redis连接被拒绝的解决方案
You might like
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
php中设置index.php文件为只读的方法
2013/02/06 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
2015/12/22 PHP
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
调试Python程序代码的几种方法总结
2015/04/28 Python
Python使用pymysql小技巧
2017/06/04 Python
Django开发中复选框用法示例
2018/03/20 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
python“静态”变量、实例变量与本地变量的声明示例
2020/11/13 Python
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
安康杯竞赛活动总结
2014/05/05 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
Python机器学习之逻辑回归
2021/05/11 Python
Go 语言结构实例分析
2021/07/04 Golang
mybatis 获取更新记录的id
2022/05/20 Java/Android