弹幕功能实现

本文介绍了一个简单的弹幕系统的实现过程,主要包括多用户并发消息处理及大屏幕消息推送两个核心问题。通过后端接收消息并存入Redis队列,再利用定时任务及WebSocket技术实现实时消息推送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

最近公司年会,需要做一个弹幕功能。需要用户在手机上发送消息,然后在大屏幕上显示。

功能问题

功能还是相对简单的,主要考虑几个问题

  1. 多用户并发发送消息,需要一条一条显示,而不能直接刷屏
  2. 大屏幕消息推送问题

解决方案

第一个问题比较好解决,后端接受消息存入队列,然后开一个定时任务pop出数据就行。
第二个问题,参考这个篇文章,使用websocket实现,h5开启消息监听,后端推送消息

废话不对说,直接上代码

代码

定时任务

@Component
public class BarrageTaskServerImpl {

    @Autowired
    private SignService signService;

    @Scheduled(cron = "0/2 * *  * * ? ")//每2秒执行一次
    @Override
    public void pushBarrageTask() {
        signService.pushBarrage();
    }

服务类

@Service
public class SignServiceImpl implements SignService {

    private static Logger logger = LoggerFactory.getLogger(SignServiceImpl.class);
    @Autowired
    private SignRedisService signRedisService;


    //推送消息
    @Override
    public void pushBarrage() {
        String barrageJson = signRedisService.popFromQueue();
        if (StringUtils.isEmpty(barrageJson)) {
            return;
        }
        BarrageMessageBo barrageMessageBo =JSONObject.parseObject(barrageJson, BarrageMessageBo.class))
        //消息推送
        //dubbo
        logger.info(LogUtils.format("barrage_push", wsRequestVo.getMessage()));
    }

    //保存消息到redis
    @Override
    public void inBarrage(BarrageMessageBo barrageMessageBo) {
        String msg=JSONObject.toJSONString(barrageMessageBo);
        signRedisService.addToQueue(msg);
    }
}

redis 队列

@Service
public class SignRedisServiceImpl implements SignRedisService {
    @Autowired
    private RedisClient redisClient;

     //入队列
    @Override
    public void addToQueue(String content) {
        String key = RushConstants.BARRAGE_KEY;
        redisClient.addToList(key, false, content);
    }

    //出队列
    @Override
    public String popFromQueue() {
        String key = RushConstants.BARRAGE_KEY;
        return redisClient.popFromList(key);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值