文件的秒傳、分片上傳以及斷點續傳 || Redis緩存減輕數據庫讀寫壓力

實現文件的秒傳、分片上傳以及斷點續傳的功能。使用 Redis 緩存上傳的文件分片信息減輕數據庫讀寫壓力,同時防止有人惡意攻擊服務器導致服務器磁盤爆滿無法提供服務。


🔍 詳解:

1. 實現文件的秒傳、分片上傳以及斷點續傳功能
  • 秒傳(Instant Upload)
    用戶上傳文件時,先計算文件的 MD5 值,如果該 MD5 對應的文件在服務器上已存在,則不再上傳,直接生成文件引用,極大節省帶寬和上傳時間。

  • 分片上傳(Chunk Upload)
    將大文件切分為若干小分片(chunks)逐個上傳,提升大文件上傳成功率,避免因一次性傳輸失敗而重傳整個文件。

  • 斷點續傳(Resume Upload)
    上傳中斷后,下次上傳時從上次已上傳的分片繼續上傳,而不是重新上傳所有數據,提升用戶體驗并節省網絡資源。


2. 使用 Redis 緩存上傳的文件分片信息,減輕數據庫讀寫壓力
  • Redis 作為內存型數據庫,用于臨時記錄每個用戶上傳的文件分片狀態(如已上傳的分片編號、大小等)。
  • 這樣可以避免頻繁讀寫 MySQL,從而提升系統性能,減少數據庫壓力。

示例:

Key: upload:{userId}:{fileMd5}
Field: chunkIndex1 => uploaded
Field: chunkIndex2 => uploaded
...

3. 防止有人惡意攻擊服務器導致服務器磁盤爆滿無法提供服務
  • 攻擊方式:偽裝成正常用戶,不斷上傳分片但不合并,長時間占用磁盤空間。

  • 解決策略:

    • 使用 Redis + 延時任務(如 ZSet + Kafka)記錄每個上傳任務超時時間;
    • 若長時間未完成上傳合并,則觸發清理任務,刪除臨時分片 + 回收空間記錄
    • 通過這種方式防止大量臨時文件殘留占滿磁盤,確保服務可用性。

? 總結:

系統通過實現秒傳、分片上傳和斷點續傳提升上傳效率與用戶體驗,并結合 Redis 緩存與延時任務機制,有效降低數據庫壓力并防御惡意上傳行為,保障磁盤資源和系統穩定性。


文件的秒傳、分片上傳、斷點續傳


🧩 一、文件的秒傳(Instant Upload / Fast Upload)

? 概念

“秒傳”是指:當用戶上傳一個文件時,系統會判斷該文件是否已經存在于服務器上。如果已存在,則無需真正上傳文件內容,直接在數據庫中為該用戶創建一個引用關系,完成上傳操作。

? 實現原理

  • 客戶端在上傳前計算該文件的 唯一哈希值(如 MD5 或 SHA256)

  • 將該哈希值發送給服務器。

  • 服務器查詢該哈希是否已存在(已上傳的文件表)。

    • 存在 → 秒傳成功,僅做數據庫記錄,不傳文件;
    • 不存在 → 繼續正常的分片上傳流程。

? 優點

  • 避免重復上傳同一文件,節省帶寬;
  • 提高上傳速度,尤其是常用/熱門文件。

🧩 二、分片上傳(Chunked Upload)

? 概念

將大文件切成多個小塊(分片),逐個上傳。這種方式適用于不穩定的網絡環境,可以容忍部分上傳失敗而不影響整體進度。

? 實現方式

  1. 客戶端

    • 將文件按固定大小(如1MB)分片;
    • 每個分片附帶文件總 MD5、分片序號、總分片數等元信息;
    • 分片逐個上傳。
  2. 服務端

    • 接收每個分片,保存至臨時目錄;
    • 使用 Redis 緩存當前已上傳的分片索引;
    • 等全部分片上傳完畢后,合并成完整文件;
    • 寫入正式存儲路徑,并清理 Redis 分片記錄和臨時文件。

? 優點

  • 降低失敗重試代價;
  • 支持更大的文件上傳;
  • 易于并發上傳,提升性能。

🧩 三、斷點續傳(Resume Upload)

? 概念

在上傳中斷(如網絡中斷、瀏覽器關閉)后,用戶再次上傳該文件時,可以從中斷的分片位置繼續上傳,而無需從頭開始。

? 實現機制

  • 上傳前,客戶端向服務端查詢該文件對應的已上傳分片列表;
  • 服務端從 Redis 或數據庫中查到已上傳的分片序號;
  • 客戶端只需上傳未上傳的分片;
  • 服務端補齊分片后繼續合并文件。

? 核心點

  • Redis 緩存每個文件的上傳狀態(如:哪些分片已完成);
  • 分片文件統一保存到臨時目錄,命名規則中含有用戶ID + 文件MD5 + 分片索引;
  • 定期清理長期未完成上傳的臨時分片,避免空間浪費。

? 優點

  • 提升用戶體驗,上傳中斷可恢復;
  • 適用于大文件和移動設備;
  • 減少帶寬浪費。

? 總結對比表

功能核心作用關鍵技術點主要優勢
秒傳判斷是否重復上傳文件哈希(MD5、SHA256)節省帶寬,極速上傳
分片上傳大文件分塊分次上傳客戶端分片、服務端合并容錯性強,適配弱網絡環境
斷點續傳上傳中斷后斷點恢復Redis 緩存、上傳狀態查詢減少失敗重傳,提升用戶體驗

🎤 上傳功能模塊詳解

在云盤項目中實現了上傳模塊,詳細說一下你們是怎么處理大文件上傳、斷點續傳、以及秒傳的?

是的,這一塊是我主導設計和實現的,我從三個方面來說:秒傳、分片上傳、斷點續傳,并介紹我們如何利用 Redis 減少數據庫壓力,同時避免惡意攻擊 的問題。


? 第一,秒傳功能

我們在用戶上傳文件前,會先計算整個文件的 MD5 值,然后將這個 MD5 發送到服務器。

  • 服務器會先查找該 MD5 是否存在于文件記錄表中。
  • 如果存在,說明這個文件已經有人上傳過了,我們就可以直接在數據庫中記錄一條文件引用關系,不需要再次上傳文件。
  • 這樣我們就實現了“秒傳”——文件其實沒上傳,但用戶看到已經上傳成功。

這個功能的意義在于可以避免重復上傳文件,節省帶寬和服務器資源,特別是在多個用戶之間共享同一文件的場景下非常高效。


? 第二,分片上傳

對于大文件,我們采用的是 分片上傳 的方式。

  • 客戶端會把大文件按一定大小,比如1MB,切成多個分片;
  • 每個分片單獨上傳,并攜帶:文件 MD5、分片索引、總分片數等信息;
  • 服務端接收后,把分片暫存在臨時目錄中,文件名規則中會包含 用戶ID+MD5+分片索引
  • 并把已上傳的分片信息記錄到 Redis,比如用一個 Set 結構標記當前文件已完成的分片列表;
  • 等所有分片都上傳完成后,由后端合并這些分片,生成完整文件

這個機制帶來的好處是:網絡不穩定也能斷點重試,每個分片都可單獨上傳,并行性高,效率也更高


? 第三,斷點續傳

斷點續傳是基于分片上傳的擴展功能。

  • 當用戶中斷上傳后(比如網絡斷了或瀏覽器關閉),再次上傳這個文件時,前端會根據 文件MD5 + 用戶ID 請求服務端查詢已上傳的分片索引;
  • 服務端從 Redis 里返回已上傳的分片列表;
  • 客戶端跳過這些分片,只上傳剩下未完成的分片

這種方式能顯著提升用戶體驗,尤其是大文件或上傳中斷的場景。


? Redis 在這里的作用

我們沒有直接把每個分片信息寫入數據庫,而是使用 Redis 作為緩存層:

  • 一方面,降低數據庫寫入壓力,避免頻繁寫入;
  • 另一方面,通過緩存控制上傳行為,防止惡意攻擊造成服務器硬盤爆滿

比如:

  • 有人惡意頻繁上傳大文件的分片但不合并,正常流程不會增加用戶空間;
  • 但這些臨時分片文件會持續占用磁盤;
  • 我們會通過 Redis + 延時任務機制記錄每個文件的上傳狀態,定期清理未完成的文件;
  • 并且維護 use_space_unfinished 這樣一個字段,表示“未合并完成文件的總大小”,和 use_space_finished 分開存;
  • 系統判斷磁盤是否超限,是通過這兩個值之和。

? 總結

這三個上傳功能是密切相關的:

  • 秒傳:避免冗余傳輸;
  • 分片上傳:支持大文件、容錯性強;
  • 斷點續傳:中斷后恢復,提升體驗;
  • Redis 緩存:減壓數據庫 + 控制風險;
  • 同時我們后續結合了 Kafka 做延時任務調度,對未合并的分片進行智能清理,保證系統可持續運行。

? 面試官可能追問(你可以這樣接)

面試官:如果 Redis 數據丟了怎么辦?你怎么保證數據庫和 Redis 最終一致?

你可以答:
我們每次上傳分片時都會寫 Redis,并通過 Kafka 發送異步消息,延遲執行任務時再將 未完成空間 寫入數據庫,從而保證最終一致性。即使 Redis 崩潰,Kafka 中的消息還能驅動后續數據寫入,避免數據丟失。


如果 Redis 數據丟了怎么辦?你怎么保證數據庫和 Redis 最終一致?

?問題背景

在文件上傳過程中,為了提升性能,我們使用了 Redis 來緩存用戶上傳的文件分片信息(包括已上傳的片段、未完成上傳的總大小 use_space_unfinished 等),而不是直接頻繁更新數據庫
但問題是:Redis 是內存數據庫,存在數據丟失的風險(如宕機、RDB/AOF未寫入等)。
那么:Redis 掛了或者數據丟了,我們怎么保證數據庫數據依然準確?系統還能恢復嗎?


? 我們的設計目標:最終一致性

我們不是追求強一致性(強一致性下 Redis 就不能丟),而是保證 最終一致性

即使 Redis 崩潰,通過 Kafka 消息 + 定時任務重處理機制最終數據庫的數據一定是正確的


🧠 核心思路:異步延時寫數據庫 + Kafka 兜底

? 1. 上傳過程中,所有用戶的 use_space_unfinished 信息先寫入 Redis

  • 每上傳一個分片:

    • Redis 記錄該文件當前已上傳的分片列表;
    • Redis 增加該用戶的 use_space_unfinished
  • 每次更新 Redis 的同時,我們會將上傳信息 作為消息發送到 Kafka 延時隊列(或普通隊列配合定時任務處理)。

? 2. Kafka 消費者異步更新 MySQL(延遲寫入)

  • Kafka 的消息內容:{userId, fileMd5, 當前上傳的分片大小, timestamp}
  • Kafka 消費者接收到消息后,經過一定延遲后,再寫入 MySQL 中的 use_space_unfinished 字段
  • 此時系統就完成了一次異步更新:Redis 快速響應,Kafka 異步落庫,性能與安全兼顧

💣 如果 Redis 崩潰了怎么辦?

?? 情況1:短暫宕機,Kafka 尚未消費

  • Redis 掛了不影響 Kafka;
  • Kafka 中消息仍然存在;
  • 消費者重啟后,Kafka 會自動重新投遞未處理消息
  • 仍然可以補償寫入數據庫;
  • 數據庫數據不會丟,最終一致性得以保障。

?? 情況2:Redis 掛了、Kafka 也丟了?

  • Kafka 默認有消息持久化機制,消息不會輕易丟;

  • 如果真的同時丟(極端情況),我們可以:

    • 通過 定時掃描臨時文件目錄,判斷哪些上傳超時未合并;
    • 使用用戶上傳記錄、文件碎片路徑等重建上傳記錄;
    • 重算 use_space_unfinished 并寫入 MySQL。
    • 這屬于“容災補償機制”。

🧰 技術細節總結

技術點作用
Redis 緩存快速記錄分片狀態與用戶未完成空間占用,避免頻繁 DB IO
Kafka 異步通道保障數據寫入流程的延遲解耦,實現數據持久化緩沖與補償
MySQL 最終寫入use_space_unfinished、分片記錄最終落庫,持久化核心數據
延遲任務機制清理超時未完成上傳、維護空間一致性
冪等性處理Kafka 消費者必須冪等處理(如根據任務 ID 判重),避免重復寫入

? 面試中回答:

我們通過 Redis 快速緩存上傳狀態,同時將每個上傳分片的元信息異步發送到 Kafka。Kafka 消費者會延遲一段時間后將上傳占用的未完成空間數據寫入 MySQL,從而實現最終一致性。如果 Redis 崩潰了,我們仍能從 Kafka 補償更新數據庫,確保數據準確。同時我們有超時任務清理機制,能識別上傳失敗或中斷的文件,避免資源泄露。這樣做的好處是既降低了數據庫壓力,又提升了系統的容錯能力和可恢復性。


如何使用 Redis 緩存上傳的文件分片信息,從而減輕數據庫的讀寫壓力提升性能,并且防止磁盤資源被惡意攻擊耗盡

? 一、問題背景

用戶上傳一個大文件(比如 1GB),我們會將它分成多個小的“分片”進行上傳。例如:

文件A:共10個分片,每個分片10MB

如果每上傳一個分片我們都去操作數據庫:

  • 會產生大量頻繁的 寫請求(一次上傳 = N 次寫庫);
  • MySQL 屬于磁盤存儲,寫入開銷大
  • 數據庫本身的 QPS 很有限,很容易被打爆。

因此,我們需要一個中間層 —— Redis 緩存


? 二、Redis 緩存的核心作用

🧠 用 Redis 緩存上傳狀態(代替頻繁寫庫)

在上傳過程中:

  • 記錄:當前已上傳的分片編號;
  • 臨時計算:該用戶上傳但尚未合并的文件空間(用于判斷是否超限);
  • 狀態標記:記錄上傳是否完成、是否需要合并、是否被取消等。

這些數據原本都應寫入數據庫,但 Redis 擁有:

  • 高速讀寫性能(QPS > 10萬+)
  • 天然支持原子操作、集合管理(比如 Set/Zset)
  • 支持過期策略,可定期清理數據

因此用 Redis 做臨時緩存,可以極大降低數據庫負載。


? 三、Redis 的數據結構設計示意

以下是幾個核心的緩存鍵設計:

Redis Key 名稱類型作用
upload:{userId}:{fileMd5}:chunksSet當前已上傳分片編號集合
upload:{userId}:{fileMd5}:sizeString已上傳分片大小匯總(用于限制未完成空間)
user:{userId}:use_space_unfinishedString用戶未完成上傳所占空間
user:{userId}:use_space_totalString已完成上傳文件所占空間

示例:

SADD upload:123:abcd1234:chunks 1 2 3
INCRBY user:123:use_space_unfinished 10485760  # +10MB

? 四、緩存 + 延遲寫入數據庫(最終一致)

使用 Redis 作為上傳狀態的實時緩存后,我們不立即更新數據庫,而是采用 異步寫入

  1. 每次上傳一個分片 → 更新 Redis;
  2. 同時將信息發到 Kafka 延遲隊列(或加入延遲任務);
  3. Kafka 消費者延時寫入 MySQL(例如每 10 秒批量寫);
  4. 上傳完成時合并數據,正式更新數據庫已用空間。

這樣設計的優點是:

  • 上傳體驗流暢(Redis 快);
  • 數據庫不被頻繁寫入;
  • 保障最終一致性,可靠補償;

? 五、上傳完成前如何防止磁盤打爆?

防攻擊策略:

  • 每上傳一個分片,就立刻在 Redis 中增加 user:xxx:use_space_unfinished;
  • 服務器校驗:use_space_unfinished + use_space_total ≤ 用戶最大限額
  • 如果超限則直接拒絕上傳請求;
  • 定期掃描 Redis 和磁盤上的臨時文件,清理過期未完成的上傳記錄。

? 總結一句話回答:

為了避免每個文件分片都寫一次數據庫,我們使用 Redis 緩存用戶的上傳狀態、分片列表和未完成上傳的總大小。這一方面提升了系統的處理吞吐量,減少了數據庫壓力,另一方面也能實時檢測用戶是否超額占用磁盤資源,防止惡意攻擊。最終一致性則通過 Kafka 異步任務機制或定時任務補償保證。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83493.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83493.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安全大模型智驅網絡和數據安全效能躍遷

從2023年ChatGPT開始,網絡安全行業就一直嘗試和AI大模型來結合,解決網絡安全的痛點,例如告警多,專家少,新的APT攻擊層出不窮,已有的基于規則的防護手段失靈,如何使用大模型的泛化能力來提升對未…

Android S - 恢復部分應用安裝

使用展銳提供的代碼編譯出來的固件&#xff0c;不包含DeskClock等應用。 之前也遇到過這個情況&#xff0c;只是時間太久忘記了&#xff0c;在這里再次記錄&#xff01; frameworks/native/data/etc/android.app.remove.xml<?xml version"1.0" encoding"ut…

android 之 CALL

一、組件職責與定位 組件所在進程核心職責關鍵特性CallsManagerTelecom系統進程通話狀態機核心&#xff1a;管理所有Call對象的生命周期&#xff08;創建、狀態更新、銷毀&#xff09;。監聽Call狀態變化并通知所有觀察者&#xff08;如InCallController&#xff09;。通過mLi…

Swift 6 學習筆記(二)The Basics

這篇筆記也是同步 Swift 6 官方教程中的第二篇 《The Basics》&#xff0c;這篇博客中的大部分內容在第一篇中已經涉及&#xff0c;這篇可以被認為是基礎類型的的補充篇&#xff0c;多了很多說明信息。 官方教學文檔 《The Basics》&#xff1a; Swift 提供了許多基本數據類型…

【PHP】BC Math 函數參考表

BC Math 函數參考表: 函數名描述語法bcadd兩個任意精度數字的加法bcadd($num1, $num2, [scale])bcsub兩個任意精度數字的減法bcsub($num1, $num2, [scale])bcmul兩個任意精度數字乘法bcmul($num1, $num2, [scale])bcdiv兩個任意精度數字除法bcdiv($num1, $num2, [scale])bcmod…

C# TAP異步編程(Task/async/await)總結

C#中有個很好用的東西&#xff0c;TAP異步編程&#xff08;Task-based Asynchronous Pattern&#xff09;&#xff0c;是目前C#推薦的異步編程模型。它基于 System.Threading.Tasks.Task 和 async/await 關鍵字&#xff0c;旨在簡化異步代碼的編寫、調試和維護。TAP 是現代 .NE…

達夢數據庫(DM)用戶名大小寫處理規則

達夢數據庫(DM)用戶名大小寫處理規則 達夢數據庫對用戶名的處理與PostgreSQL和Oracle有所不同&#xff0c;以下是相關說明&#xff1a; 一、基本規則 默認情況下&#xff1a;達夢數據庫區分用戶名大小寫 創建的用戶名會保留原始大小寫格式連接時必須使用相同的大小寫形式 …

黑馬點評面試話術

文章目錄 1.項目介紹2. 分布式登錄功能2.1 講講登錄的整個流程2.2 集群模式session下存儲用戶信息會有啥問題&#xff1f;2.3 為什么采用redis存儲用戶信息和驗證碼2.4 redis的存儲格式怎么樣的&#xff1f;2.5 為什么采用Hash結構存儲用戶信息2.6 為什么采用雙攔截器&#xff…

MTK APEX測光系統中各變量具體的計算方式探究

目錄 一、APEX測光系統介紹 二、MTK測光系統實例介紹 三、關于測光系統的一些疑問 一、APEX測光系統介紹 詳細內容可以參考; AE(自動曝光)系統簡介

K8S的基本概念

Kubernetes是一個開源的容器編排部署管理平臺,用于管理云平臺中多個主機上的容器化應用。Kubernetes的目標是讓部署容器化的應用簡單并且高效,Kubernetes提供了應用部署、規劃、更新、維護的一種機制。 對應用開發者而言,可以把Kubernetes看成一個集群操作系統。Kubernetes…

NLP學習路線圖(三十四): 命名實體識別(NER)

一、命名實體識別(NER)是什么? 命名實體識別(Named Entity Recognition, NER)是自然語言處理中的一項關鍵序列標注任務。其核心目標是從非結構化的文本中自動識別出特定類別的名詞性短語,并將其歸類到預定義的類別中。 核心目標:找到文本中提到的命名實體,并分類。 典…

大三自學筆記:探索Hyperlane框架的心路歷程

## Day 1&#xff1a;初識 Hyperlane 在 GitHub 上發現了 Hyperlane 這個 Rust HTTP 框架&#xff0c;立刻被它的性能數據吸引。官方文檔寫著&#xff1a; > "hyperlane 是一個高性能且輕量級的 Rust HTTP 框架&#xff0c;設計目標是簡化現代 Web 服務的開發&#xff…

Java大廠面試真題:謝飛機的技術挑戰

Java大廠面試真題&#xff1a;謝飛機的技術挑戰 場景一&#xff1a;電商場景 面試官&#xff1a;在電商項目中&#xff0c;我們通常需要處理大量的并發請求。請談談你對JVM調優的理解。 謝飛機&#xff1a;嗯&#xff0c;JVM調優主要是為了提高程序的性能和穩定性。比如&…

【Docker管理工具】安裝容器管理工具Oxker

【Docker管理工具】安裝Oxker容器管理工具 一、Oxker介紹1.1 Oxker簡介1.2 Oxker功能1.3 Docker介紹 二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹 三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本 四、下載Oxker鏡像五、安裝Oxke…

產品成本分析怎么做?從0到1搭建全生命周期分析框架!

目錄 一、為什么要做產品全生命周期成本分析&#xff1f; 1.資源再分配 2.動態成本校準 3.戰略決策支持 二、產品成本分析思路 1.建立全生命周期成本追蹤 2.聯動分析關鍵指標 3.定位問題產品線 4.資源效率四象限分配 三、產品成本分析指標 1.分投入成本&#xff1a;…

機器學習與深度學習20-數學優化

目錄 前文回顧1.梯度下降的基本原理2.什么是損失函數&#xff1f;3.隨機梯度下降和小批量梯度下降4.什么是學習率5.優化算法中的收斂性6.常用的數學優化算法 前文回顧 上一篇文章鏈接&#xff1a;地址 1.梯度下降的基本原理 梯度下降&#xff08;Gradient Descent&#xff0…

Photoshop 2025 性能配置全攻略:硬件選購與軟件優化指南

一、硬件配置核心建議 根據Adobe官方要求及實測反饋&#xff0c;Photoshop 2025對硬件的需求側重CPU、內存和存儲&#xff0c;顯卡需求相對寬松&#xff0c;但特定功能&#xff08;如AI濾鏡、3D渲染&#xff09;需關注顯卡性能。 硬件類別最低配置推薦配置&#xff08;流暢運…

華為云Flexus+DeepSeek征文 | 華為云ModelArts Studio快速上手:DeepSeek-R1-0528商用服務的開通與使用

華為云FlexusDeepSeek征文 | 華為云ModelArts Studio快速上手&#xff1a;DeepSeek-R1-0528商用服務的開通與使用 引言一、ModelArts Studio平臺介紹華為云ModelArts Studio簡介ModelArts Studio主要特點 二、開通DeepSeek-R1-0528商用服務訪問ModelArts Studio控制臺DeepSeek-…

day53 神經網絡調參指南

目錄 一、引言 二、權重初始化&#xff1a;為何如此重要&#xff1f; &#xff08;一&#xff09;隨機種子&#xff1a;確保實驗的可重復性 &#xff08;二&#xff09;權重初始化的重要性 1. 神經網絡的對稱性問題 2. 避免梯度消失和梯度爆炸 &#xff08;三&#xff0…

【大模型02---Megatron-LM】

文章目錄 Megatron-LM數據并行模型并行張量并行流水線并行 3D并行 Megatron-LM Megatron是當前大模型訓練時經常使用的一種分布式并行框架&#xff0c;它通過采用DP,TP,PP等來加速模型的訓練&#xff0c;反正就是一個字&#xff0c;好。 大模型在訓練的時候&#xff0c;顯存占…