在直播软件源码开发过程中,消息系统是非常关键的,无论是直播间内的消息还是平台内的消息,都关系着用户的使用体验,所以今天我们先用一个简单的"拉"模型搭建一个简单的直播间消息系统。

基本实现思路:
直播软件源码客户端每隔一个极短的时间,例如1秒亦或者更短的时间,根据直播间的id来调用服务端的接口,轮询该直播间发生的消息,服务端这边我们使用redis的SortedSet的数据结构来存储消息,其中key是直播间的房间id,score是服务器接收到该消息事件生成的时间戳,value可以简单地直接存储该消息序列化后的字符串,这样可以按照时间顺序地去存储消息,并且配置过期消息的删除逻辑,整个消息的存储就可以简单地搭建起来。

消息存储用java的伪代码所示:

 long time = new Date().getTime();try {// redis中插入消息数据jedisTemplate.zadd(V_UNIQUE_ROOM_ID, time, JSON.toJSONString(roomMessage));// 按照概率性的去删除redis中过期的消息数据if (probability()) {deleteOverTimeCache(V_UNIQUE_ROOM_ID);}} catch (Exception e) {log.error("message save error", e);}

可以看到直播软件源码消息存储,如果使用redis的sortedSet进行存储还是比较方便的,接下来我们需要处理就是redis中过期消息的删除,因为在直播软件源码中无效的过期消息是没有价值的(所有的消息可以做持久化存储),redis中如果单一的key存储的消息过多,也会导致消息的慢查,和内存的使用量不断增大,这是我们不想看到的,这边因为是示例代码,所以简单地处理一下删除逻辑。

    private void deleteOverTimeCache(String roomId) {Long totalCount = jedisTemplate.zcard(roomId);log.info("deleteOldTimeCache size is {}", totalCount);if (totalCount < 600) {return;}// 倒序删除过期数据Set<Tuple> tuples = jedisTemplate.zrangeWithScores(roomId, -601, -1);if (CollectionUtils.isNotEmpty(tuples)) {for (Tuple tuple : tuples) {// 这是第一个-600条的那个scoredouble score = tuple.getScore();jedisTemplate.zremrangeByScore(roomId, 0d, score);break;}}}

上面的伪代码probability()首先先做一个概率性的判断,例如我们做百分之一的随机判断,判断该次请求是否要进行消息的删除(请注意我们删除的逻辑是放在插入的逻辑之中的。如果每一次插入都需要判断是否要删除过期数据,会影响插入的性能)。如果通过概率性判断后,我们就优先判断直播软件源码中某一直播间的消息个数,如果消息个数还是比较少的话,则退出删除逻辑,如果超过消息阀值,则按照时间倒序删除已经过期的消息。

说完了http短轮询消息的存储后,我们最后再简单地说一下客户端消息查询实现逻辑。直播软件源码客户端通过直播间id和时间戳两个字段来请求服务端以查询直播间消息,其中"时间戳"是每一次服务端返回的,这个时间戳是渐进式的,当下一次客户端来请求服务端的数据的时候,都会带来上次服务端返回的时间戳,伪代码如下:

   @Overridepublic RoomMessage queryRoomMessages(MessageMessageReq messageMessageReq) {RoomMessage result = new RoomMessage();long timestamp = messageMessageReq.getTimestamp();Set<Tuple> tuples = null;if (timestamp == 0) {// 如果传递是0,说明这个客户端终端是第一次来轮询,我们只要返回一个最近最新的消息返回即可tuples = jedisTemplate.zrevrangeWithScores(UNIQUE_ROOM_ID, 0, 0);} else// 加上一毫秒,返回后续的消息,每次返回5个,防止客户端因为低端手机原因,过多的消息渲染不出来tuples = jedisTemplate.zrangeByScoreWithScores(UNIQUE_ROOM_ID, timestamp + 1, System.currentTimeMillis(), 0, 5);}List<EachRoomMessage> eachRoomMessages = new ArrayList<>();long lastTimestamp = 0L;if (!CollectionUtils.isEmpty(tuples)) {for (Tuple tuple : tuples) {//最后一次循环后,会把最后一条消息产生的时间戳,返回给客户端,这样下次客户端就可以拿着这个时间戳来进行查询lastTimestamp = new Double(tuple.getScore()).longValue();eachRoomMessages.add(JSON.parseObject(tuple.getElement(), EachRoomMessage.class));}}result.setTimestamp(lastTimestamp);result.setEachRoomMessages(eachRoomMessages);return result;}

上述三段比较完整地代码主要陈述了一个依赖http短轮询这种方式快速实现的直播软件源码直播间的能力,这种方式是比较粗糙的,不过却是一个很好的实现思路。以上就是“直播软件源码开发,直播间内消息系统的实现”的全部内容,希望对大家有帮助。

直播软件源码开发,直播间内消息系统的实现相关推荐

  1. 一对一直播软件源码开发,一对一直播怎么开发

    直播行业自2016年的"千播大战",时至今日,直播平台内容同质化现象严重,反倒是一对一直播软件如"雨后春笋"般进入了人们的视野.一对一直播软件源码开发核心业务模 ...

  2. 一对一直播软件源码开发,iOS视频采集的实现过程

    在一对一直播软件源码日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的技术和原理进行梳理和总结. 认识 AVC ...

  3. 直播软件源码开发,实现小程序直播的功能

    为了方便用户观看,有些直播软件源码支持小程序端观看,那么小程序的直播软件源码功能如何实现呢,就让我们一起看一下吧. 1.添加直播组件 以mpvue为例 //app.json "plugins ...

  4. 视频交友直播软件源码开发的必备功能讲解

    相信通过这两年行业的发展我们不难看出.视频交友直播源码拥有简单直接的变现方式,深受平台和用户的喜爱,越来越多的年轻人也热衷于视频直播. 视频交友直播软件开发,支持用户在视频过程中用文字沟通,可以互相发 ...

  5. 一对一直播软件源码开发,直播相关技术详解

    一对一直播软件源码中直播流程图 一.数据采集 通过一对一直播软件源码移动设备的端麦克风摄像头采集音视频数据. 视频采集 AVCaptureDevice 前后摄像头作为视频源生成输入 AVCapture ...

  6. 仿比心一对一直播软件源码开发,消息通知功能的实现

    在仿比心一对一直播软件源码中,消息功能起着非常重要的作用,非实时性的社交都可以通过消息功能来实现,在即时消息模块有两个基本功能就是发送消息和接收消息.我们定义如下通信指令来实现这两个功能: Push ...

  7. 实现简单的直播互动功能,直播软件源码是如何做的

    近两年,很多电商平台开始关注起直播互动电商,希望在直播中,也可以增加互动,例如在直播过程中,抛出限量优惠商品,实时发送抢购的消息给观众.于是我们做了一个简单的直播软件源码Demo. Demo大致的整体 ...

  8. 通过Nginx实现直播软件源码的推流和拉流

    推流和拉流是直播软件源码实现直播的重要步骤,今天我们分析一下如何通过Nginx实现直播软件源码的推拉流. ​ 理论介绍 1.RMTP, Real Time Messaging Protocol 实时消 ...

  9. 手机直播开发,直播程序源码,直播源码分享经验

    手机直播开发,直播程序源码,直播系统开发,直播源码 2016-2017年是网络直播元年,发展了酝酿了10来年的网络直播市场终于在这一年开始喷发,手机直播开发更成为炙手可热的市场新宠儿,而如何进行手机直 ...

最新文章

  1. 2659: [Beijing wc2012]算不出的算式
  2. 代码chaid_[转载]经典决策树之SAS实现--CHAID
  3. mysql 即学a又学b_MySQL学习第一天
  4. Lua 学习笔记(四)语句与控制结构
  5. matlab输出语句fprintf格式,matlab输出语句fprintf
  6. 贪吃蛇游戏-小程序游戏
  7. 电阻电感电容基本单位、读数、封装类型、种类
  8. 在matlab下使用预训练模型Alex Net进行迁移学习的实验与分析
  9. 数据科学和人工智能技术笔记 十八、Keras
  10. 图像算法工程师——面试经验
  11. [乡土民间故事_徐苟三传奇]第八回_张财主误喊“你来看”
  12. java全套学习课程
  13. 值得收藏-装修攻略全
  14. (专升本)PowerPnt(PowerPoint 2010的其他功能)
  15. charles入门使用
  16. 分布式与集群的区别 .
  17. OutLook中添加、取消送信者禁止
  18. 在Home Assistant中配置天气信息
  19. 如何将数据指标异常监控和归因分析自动化
  20. 计算机考研复试-离散数学

热门文章

  1. JY901模块连接ATK-1218-BD,GPS/北斗通过JY901上位机显示数据
  2. U盘数据莫名丢失,如何才能恢复
  3. 机器视觉尺寸检测基础
  4. flex布局的对齐方式
  5. 安装了微信支付的安全控件,检测不到,总提示安装-解决方案
  6. CAD自学不要怕,这里有你需要的CAD制图初学入门教程!
  7. SEO优化百度文库外链做法
  8. 4G拨号上网 之 AT指令学习
  9. Python查询和更新版本号的常用命令行
  10. matlab imfill,Python相当于Matlab的灰度函数imfill?