浅谈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 相关文章推荐
详解RedisTemplate下Redis分布式锁引发的系列问题
Apr 27 Redis
浅谈redis缓存在项目中的使用
May 20 Redis
嵌入式Redis服务器在Spring Boot测试中的使用教程
Jul 21 Redis
Redis如何实现分布式锁
Aug 23 Redis
基于Redis的List实现特价商品列表功能
Aug 30 Redis
Redis读写分离搭建的完整步骤
Sep 14 Redis
使用Redis做预定库存缓存功能
Apr 02 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
浅谈Redis缓冲区机制
Jun 05 Redis
基于Redission的分布式锁实战
Aug 14 Redis
python中使用redis用法详解
Dec 24 Redis
Redis配置外网可访问(redis远程连接不上)的方法
Dec 24 Redis
redis限流的实际应用
Apr 24 #Redis
Redis安装启动及常见数据类型
redis配置文件中常用配置详解
Apr 14 #Redis
Redis遍历所有key的两个命令(KEYS 和 SCAN)
Apr 12 #Redis
浅谈redis五大数据结构和使用场景
Redis如何一键部署脚本
redis连接被拒绝的解决方案
You might like
hadoop中一些常用的命令介绍
2013/06/19 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
jQuery MD5加密实现代码
2010/03/15 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
vue实现通讯录功能
2018/07/14 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
python 获取本机ip地址的两个方法
2013/02/25 Python
Python中列表(list)操作方法汇总
2014/08/18 Python
Python获取央视节目单的实现代码
2015/07/25 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
Python扫描端口的实现
2021/01/25 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
师范生实习个人的自我评价
2013/09/28 职场文书
实习自荐信
2013/10/13 职场文书
网上书店创业计划书
2014/01/12 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
六一亲子活动总结
2014/07/01 职场文书
小学优秀学生评语
2014/12/29 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
Python turtle实现贪吃蛇游戏
2021/06/18 Python
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js