52人参与 • 2026-02-03 • mongodb
视频播放过程中通常存在以下需求:

| 原因 | 说明 |
|---|---|
| 写入频繁 | 每 5~10 秒保存一次进度 |
| 数据结构简单 | 用户 + 视频 + 秒数 |
| 不需要事务 | 单条数据即可 |
| 扩展性好 | 适合大用户量 |
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
find + save1. 进入视频页面 2. 调用 getplaysecond(videoid) 3. 播放器 seek 到返回的秒数 4. 播放过程中每 10 秒调用 updateplayprocess 5. 页面关闭 / 切视频时最后一次保存
是否需要保存毫秒级?
❌ 不需要
✔ 秒级即可,节省存储 & 减少写入
如何降低 mongodb 写压力?
是否需要按用户分集合?
❌ 不推荐
✔ 单集合 + 复合索引更稳妥
使用 mongodb 存储视频播放进度,
通过 userid + videoid 唯一索引保证幂等,
利用 upsert 实现高效的断点续播功能。
该方案:
视频播放进度使用 mongodb 存储,
通过 upsert 保证高并发下的数据一致性,
实现视频的断点续播功能。
以上就是使用mongodb实现视频播放进度的保存与恢复(断点续播)的详细内容,更多关于mongodb视频播放进度保存与恢复的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论