最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用MongoDB實現(xiàn)視頻播放進度的保存與恢復(斷點續(xù)播)

 更新時間:2026年02月03日 09:11:17   作者:Knight_AL  
在視頻類業(yè)務中,斷點續(xù)播 是最基礎、也是最核心的能力之一,本文將介紹如何 僅使用 MongoDB 實現(xiàn)視頻播放進度的保存與恢復,適用于在線視頻、課程學習、長視頻播放等場景,需要的朋友可以參考下

一、業(yè)務場景說明

視頻播放過程中通常存在以下需求:

  • 用戶播放視頻過程中可能隨時退出頁面
  • 再次進入視頻頁面時,需要從上次播放位置繼續(xù)播放
  • 播放器會 每隔一段時間(如 10 秒)自動保存播放進度
  • 后端需要支持 高頻寫入 + 快速查詢

二、為什么選擇 MongoDB 存儲播放進度

原因說明
寫入頻繁每 5~10 秒保存一次進度
數(shù)據(jù)結構簡單用戶 + 視頻 + 秒數(shù)
不需要事務單條數(shù)據(jù)即可
擴展性好適合大用戶量

MongoDB 的 文檔模型 + 高并發(fā)寫入能力,非常適合播放進度這類數(shù)據(jù)。

三、MongoDB 數(shù)據(jù)模型設計

1、播放進度實體類

@Data
@Document(collection = "user_video_play_process")
public class UserVideoPlayProcess {

    @Id
    private String id;

    /** 用戶ID */
    private Long userId;

    /** 視頻ID */
    private Long videoId;

    /** 當前播放到的秒數(shù) */
    private BigDecimal playSecond;

    /** 視頻總時長(秒) */
    private BigDecimal duration;

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

    /** 創(chuàng)建時間 */
    private Date createTime;

    /** 更新時間 */
    private Date updateTime;
}

2、索引設計

db.user_video_play_process.createIndex(
  { userId: 1, videoId: 1 },
  { unique: true }
)

保證:

  • 一個用戶 + 一個視頻 只有一條播放進度
  • 查詢和更新都非常快

四、獲取視頻播放進度(斷點續(xù)播)

接口說明

  • 用途:進入視頻頁面時,獲取上次播放位置
  • 返回值:秒數(shù)(用于前端 seek)

Controller

@GetMapping("/getPlaySecond/{videoId}")
public Result<BigDecimal> getPlaySecond(@PathVariable Long videoId) {
    Long userId = AuthContextHolder.getUserId();
    return Result.ok(
        videoPlayProcessService.getPlaySecond(userId, videoId)
    );
}

Service 實現(xiàn)

@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();
}

五、更新視頻播放進度

前端上報規(guī)則

  • 播放過程中每 10 秒 上報一次
  • 視頻暫停 / 頁面關閉 / 切換視頻時強制上報
  • 拖動進度條結束后上報

接收參數(shù) 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 核心實現(xiàn)(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

  • 存在即更新
  • 不存在即插入
  • 一條語句完成,避免并發(fā)問題
  • 性能優(yōu)于 find + save

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

1. 進入視頻頁面
2. 調用 getPlaySecond(videoId)
3. 播放器 seek 到返回的秒數(shù)
4. 播放過程中每 10 秒調用 updatePlayProcess
5. 頁面關閉 / 切視頻時最后一次保存

七、常見問題與優(yōu)化點

是否需要保存毫秒級?

? 不需要
? 秒級即可,節(jié)省存儲 & 減少寫入

如何降低 MongoDB 寫壓力?

  • 秒數(shù)變化 < 3 秒不更新
  • 播放暫停時不上報
  • 拖動結束才上報

是否需要按用戶分集合?

? 不推薦
? 單集合 + 復合索引更穩(wěn)妥

八、方案總結

使用 MongoDB 存儲視頻播放進度,
通過 userId + videoId 唯一索引保證冪等,
利用 upsert 實現(xiàn)高效的斷點續(xù)播功能。

該方案:

  • 實現(xiàn)簡單
  • 性能穩(wěn)定
  • 易于擴展(學習進度、是否看完)

視頻播放進度使用 MongoDB 存儲,
通過 upsert 保證高并發(fā)下的數(shù)據(jù)一致性,
實現(xiàn)視頻的斷點續(xù)播功能。

以上就是使用MongoDB實現(xiàn)視頻播放進度的保存與恢復(斷點續(xù)播)的詳細內容,更多關于MongoDB視頻播放進度保存與恢復的資料請關注腳本之家其它相關文章!

相關文章

  • MongoDB??數(shù)據(jù)模型的設計模式及優(yōu)缺點

    MongoDB??數(shù)據(jù)模型的設計模式及優(yōu)缺點

    這篇文章主要介紹了MongoDB??數(shù)據(jù)模型的設計模式,在實際開發(fā)中,大多數(shù)性能問題都可以追溯到糟糕的模型設計,官方也提供分享過文檔模型設計的進階技巧,這里簡單翻譯記錄一下,需要的朋友可以參考下
    2022-12-12
  • Mac中mongoDB的安裝與卸載步驟詳解

    Mac中mongoDB的安裝與卸載步驟詳解

    mongoDB是一個非常不錯的數(shù)據(jù)庫,最近也正在學習mongoDB,在使用一個數(shù)據(jù)庫前必不可少的就是安裝和卸載,所以下面這篇文章主要給大家介紹了關于Mac系統(tǒng)中mongoDB安裝與卸載的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • MongoDB進階之動態(tài)字段設計詳解

    MongoDB進階之動態(tài)字段設計詳解

    這篇文章主要給大家介紹了MongoDB進階之動態(tài)字段設計的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-06-06
  • Mongodb副本集和分片示例詳解

    Mongodb副本集和分片示例詳解

    這篇文章主要給大家介紹了關于Mongodb副本集和分片的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Mongodb具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Mongoose 在egg中的使用詳解

    Mongoose 在egg中的使用詳解

    這篇文章主要介紹了Mongoose 在egg中的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 阿里云服務器部署mongodb的詳細過程

    阿里云服務器部署mongodb的詳細過程

    這篇文章主要介紹了阿里云服務器部署mongodb的過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • mongodb數(shù)據(jù)庫遷移變更的解決方案

    mongodb數(shù)據(jù)庫遷移變更的解決方案

    眾所周知mongodb數(shù)據(jù)庫是一個非關系類型的數(shù)據(jù),有著非常靈活和高性能的特點得到了開發(fā)者的喜愛,這篇文章主要給大家介紹了關于mongodb數(shù)據(jù)庫遷移變更的相關資料,需要的朋友可以參考下
    2021-09-09
  • Mongodb啟動命令參數(shù)中文說明

    Mongodb啟動命令參數(shù)中文說明

    這篇文章主要介紹了Mongodb啟動命令參數(shù)中文說明,本文包括基本配置、主/從參數(shù)、Sharding(分片)選項等內容,需要的朋友可以參考下
    2014-10-10
  • MongoDB批量將時間戳轉為通用日期格式示例代碼

    MongoDB批量將時間戳轉為通用日期格式示例代碼

    這篇文章主要給大家介紹了關于MongoDB批量將時間戳轉為通用日期格式的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MongoDB具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • Centos 7下Mongodb開機無法自啟動的解決方法

    Centos 7下Mongodb開機無法自啟動的解決方法

    這篇文章主要介紹了Centos 7下Mongodb開機無法自啟動的解決方法,文中介紹的非常詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03

最新評論

西充县| 四平市| 洞口县| 林周县| 土默特左旗| 门源| 阜宁县| 那曲县| 蒙自县| 正镶白旗| 福鼎市| 正安县| 吉安县| 上栗县| 讷河市| 遵化市| 铜梁县| 大足县| 广东省| 松原市| 曲松县| 陆良县| 兴山县| 大安市| 雷波县| 平阴县| 奈曼旗| 平凉市| 阿拉善盟| 个旧市| 闵行区| 都安| 东方市| 营口市| 揭西县| 富裕县| 上饶市| 河东区| 金坛市| 济宁市| 崇信县|