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

使用MongoDB實(shí)現(xiàn)視頻播放進(jìn)度的保存與恢復(fù)(斷點(diǎn)續(xù)播)

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

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

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

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

二、為什么選擇 MongoDB 存儲播放進(jìn)度

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

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

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

1、播放進(jìn)度實(shí)體類

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

    @Id
    private String id;

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

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

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

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

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

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

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

2、索引設(shè)計(jì)

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

保證:

  • 一個用戶 + 一個視頻 只有一條播放進(jìn)度
  • 查詢和更新都非???/li>

四、獲取視頻播放進(jìn)度(斷點(diǎn)續(xù)播)

接口說明

  • 用途:進(jìn)入視頻頁面時,獲取上次播放位置
  • 返回值:秒數(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 實(shí)現(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();
}

五、更新視頻播放進(jìn)度

前端上報規(guī)則

  • 播放過程中每 10 秒 上報一次
  • 視頻暫停 / 頁面關(guān)閉 / 切換視頻時強(qiáng)制上報
  • 拖動進(jìn)度條結(jié)束后上報

接收參數(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 核心實(shí)現(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. 進(jìn)入視頻頁面
2. 調(diào)用 getPlaySecond(videoId)
3. 播放器 seek 到返回的秒數(shù)
4. 播放過程中每 10 秒調(diào)用 updatePlayProcess
5. 頁面關(guān)閉 / 切視頻時最后一次保存

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

是否需要保存毫秒級?

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

如何降低 MongoDB 寫壓力?

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

是否需要按用戶分集合?

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

八、方案總結(jié)

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

該方案:

  • 實(shí)現(xiàn)簡單
  • 性能穩(wěn)定
  • 易于擴(kuò)展(學(xué)習(xí)進(jìn)度、是否看完)

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

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

相關(guān)文章

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

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

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

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

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

    MongoDB進(jìn)階之動態(tài)字段設(shè)計(jì)詳解

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

    Mongodb副本集和分片示例詳解

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

    Mongoose 在egg中的使用詳解

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

    阿里云服務(wù)器部署mongodb的詳細(xì)過程

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

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

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

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

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

    MongoDB批量將時間戳轉(zhuǎn)為通用日期格式示例代碼

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

    Centos 7下Mongodb開機(jī)無法自啟動的解決方法

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

最新評論

仙游县| 保定市| 雅江县| 观塘区| 新泰市| 三原县| 绿春县| 琼海市| 双辽市| 阳原县| 天全县| 邵东县| 南昌县| 池州市| 聂拉木县| 华阴市| 德化县| 哈巴河县| 西青区| 许昌市| 永新县| 佛学| 会昌县| 阿克陶县| 阳西县| 泽州县| 来凤县| 邵阳市| 平安县| 琼海市| 台东县| 德江县| 新巴尔虎右旗| 无极县| 澄城县| 呼和浩特市| 廊坊市| 甘肃省| 青州市| 观塘区| 新民市|