it编程 > 数据库 > mongodb

使用MongoDB实现视频播放进度的保存与恢复(断点续播)

52人参与 2026-02-03 mongodb

一、业务场景说明

视频播放过程中通常存在以下需求:

二、为什么选择 mongodb 存储播放进度

原因说明
写入频繁每 5~10 秒保存一次进度
数据结构简单用户 + 视频 + 秒数
不需要事务单条数据即可
扩展性好适合大用户量

mongodb 的 文档模型 + 高并发写入能力,非常适合播放进度这类数据。

三、mongodb 数据模型设计

1、播放进度实体类

@data
@document(collection = "user_video_play_process")
public class uservideoplayprocess {

    @id
    private string id;

    /** 用户id */
    private long userid;

    /** 视频id */
    private long videoid;

    /** 当前播放到的秒数 */
    private bigdecimal playsecond;

    /** 视频总时长(秒) */
    private bigdecimal duration;

    /** 是否播放完成:0-未完成,1-已完成 */
    private integer isfinished;

    /** 创建时间 */
    private date createtime;

    /** 更新时间 */
    private date updatetime;
}

2、索引设计

db.user_video_play_process.createindex(
  { userid: 1, videoid: 1 },
  { unique: true }
)

保证:

四、获取视频播放进度(断点续播)

接口说明

controller

@getmapping("/getplaysecond/{videoid}")
public result<bigdecimal> getplaysecond(@pathvariable long videoid) {
    long userid = authcontextholder.getuserid();
    return result.ok(
        videoplayprocessservice.getplaysecond(userid, videoid)
    );
}

service 实现

@override
public bigdecimal getplaysecond(long userid, long videoid) {

    query query = query.query(
        criteria.where("userid").is(userid)
                .and("videoid").is(videoid)
    );

    uservideoplayprocess process =
        mongotemplate.findone(query, uservideoplayprocess.class);

    return process == null ? bigdecimal.zero : process.getplaysecond();
}

五、更新视频播放进度

前端上报规则

接收参数 vo

@data
public class videoplayprocessvo {

    private long videoid;

    private bigdecimal playsecond;

    private bigdecimal duration;
}

controller

@postmapping("/updateplayprocess")
public result updateplayprocess(
        @requestbody videoplayprocessvo vo) {

    long userid = authcontextholder.getuserid();
    videoplayprocessservice.updateplayprocess(userid, vo);
    return result.ok();
}

service 核心实现(upsert 思想)

@override
public void updateplayprocess(long userid, videoplayprocessvo vo) {

    query query = query.query(
        criteria.where("userid").is(userid)
                .and("videoid").is(vo.getvideoid())
    );

    boolean finished = vo.getplaysecond().compareto(
        vo.getduration().multiply(new bigdecimal("0.95"))
    ) >= 0;

    update update = new update()
            .set("playsecond", vo.getplaysecond())
            .set("duration", vo.getduration())
            .set("isfinished", finished ? 1 : 0)
            .set("updatetime", new date())
            .setoninsert("userid", userid)
            .setoninsert("videoid", vo.getvideoid())
            .setoninsert("createtime", new date());

    mongotemplate.upsert(
        query,
        update,
        uservideoplayprocess.class
    );
}

为什么用 upsert

六、前端播放流程说明(配合后端)

1. 进入视频页面
2. 调用 getplaysecond(videoid)
3. 播放器 seek 到返回的秒数
4. 播放过程中每 10 秒调用 updateplayprocess
5. 页面关闭 / 切视频时最后一次保存

七、常见问题与优化点

是否需要保存毫秒级?

❌ 不需要
✔ 秒级即可,节省存储 & 减少写入

如何降低 mongodb 写压力?

是否需要按用户分集合?

❌ 不推荐
✔ 单集合 + 复合索引更稳妥

八、方案总结

使用 mongodb 存储视频播放进度,
通过 userid + videoid 唯一索引保证幂等,
利用 upsert 实现高效的断点续播功能。

该方案:

视频播放进度使用 mongodb 存储,
通过 upsert 保证高并发下的数据一致性,
实现视频的断点续播功能。

以上就是使用mongodb实现视频播放进度的保存与恢复(断点续播)的详细内容,更多关于mongodb视频播放进度保存与恢复的资料请关注代码网其它相关文章!

(0)

您想发表意见!!点此发布评论

推荐阅读

MongoDB中yaml模式配置文件实现方式

02-12

Jenkins配置ssh私钥全过程

02-12

MongoDB的默认端口号是多少

02-13

MongoDB存储路径的配置指南

02-28

MongoDB分组查询、聚合查询实例

03-02

MongoDB使用更新操作符set与unset精准修改与删除字段

03-02

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论