圖片上傳-下載-刪除等圖片管理的若干經驗總結

小雷FansUnion發表於2015-10-26
圖片上傳功能很常見,很多人都覺得這個功能很簡單,隨著要求的提高,這個圖片小系統也真是複雜啊。
   
   需求1
   上傳,未了達到“大容量儲存”、“負載均衡”、“效能好”,“有技術含量”等裝逼需求,採用了Fastdfs。
   
   注:FastDFS是一個開源的輕量級分散式檔案系統,它對檔案進行管理。
   功能包括:檔案儲存、檔案同步、檔案訪問(檔案上傳、檔案下載)等,解決了大容量儲存和負載均衡的問題。
   特別適合以檔案為載體的線上服務,如相簿網站、視訊網站等等。
   
   上傳,以為只是一個“上傳”功能,細想一下,不是的哦~
   上傳的時候,需要考慮那些臨時的或者不再使用的圖片。
   
   場景1:臨時的,但沒有後續操作。
        比如,使用者選擇了新的頭像,試試預覽效果,但是最後沒有儲存,直接離開了網站。
解決辦法:如果用了Fastdfs,可以在上傳的時候,就存到資料庫,做個標記。
後面儲存了,就更新下狀態。在合適的時候,檢查下狀態,把狀態不合適的圖片刪掉,物理刪除。
   場景2:臨時的,有後續操作。
        這是比較的場景。
 
   場景3:之前的,需要刪除。
        比如,使用者儲存了新的頭像。
之前的頭像,可以物理刪除,也可以邏輯刪除。
   
   
   需求2:顯示和下載。
     可以在Nginx中配置,Fastdfs。
 
   需求3:刪除
     有些圖片,可能不需要了,要能夠刪除。
 fastdfs有提供介面。
   
   2種解決方案
   單一業務場景
   使用者上傳頭像,是其中的1種業務場景,而且是一種比較簡單的場景。通常來說,使用者頭像就是1個圖。
   實際情況中,還存在多個圖的情況。比如專案Project,可以有多個圖片。
   在上傳的時候,可以有多個圖。
   增加專案Project的時候,可以直接insert所有的圖。
   但是在更新專案Project的時候,需要區分insert、update、delete3種。
   
   a.把不再使用的圖片標記出來,如果是邏輯刪除,今後可以根據標記做出物理刪除。
     如果是物理刪除,直接幹掉。
   b.需要更新的。
      根據id更新。
   c.需要插入的。
   
   怎麼找出這3種圖?
   增加的時候:都是insert
   更新的時候:insert、update、delete都有可能存在
   輸入:
      儲存的時候,傳過來N張圖,假定為A集合:a.png、c.png、d.png。
      資料庫存在的N張圖,假定為B集合:a.png、b.png、c.png
  
  delete:B集合中,不在A中的元素,結果為b.png(高中數學集合怎麼表示來著~)
      update:同時存在A和B中的元素,a.png,b.png
  insert:在A中,但不在B中的元素,c.png,d.png
   
   多種業務場景
     一般的系統,會有多個地方用到圖片,比如使用者頭像、使用者相簿、專案的圖片等。
 可以針對每個業務場景,考慮圖片的增加-修改-刪除操作。
 
 我想,也可以採用整體的解決辦法。
 2步走
 第1步:上傳圖片的時候,只做insert操作,把之前的圖片標記為“已刪除”。
 或者部分insert,部分update。
 第2步:找出那些需要刪除的圖片,物理刪除或邏輯刪除。
 
 所有圖片上傳,都經過fastdfs,理論上可以查詢出所有存在的物理圖片,這是圖片的“全集”S。
  如果不支援,那麼在上傳圖片的介面中,增加儲存到資料庫(單獨一張表)的程式碼。
     統計所有業務場景,正在使用的圖片集合U,邏輯刪除的圖片集合V。
 
 新建一張表P:
 a.把邏輯刪除集合V中的,分佈在多個表的圖片資料,統一放到P表。
 b.S-U-V,就是所有需要物理刪除的圖片資料,統一放到P表。
        比如臨時上傳的這種圖片。
 
 最後,給操作員1個統一的圖片刪除介面。物理刪除的,直接執行Fastdfs刪除。
 邏輯刪除的,變為物理刪除的,把資料庫表的物理刪除,Fastdfs刪除。
 
 以上屬於個人總結,鑑於實際情況,採用了單一業務場景的方案。
 其實我更想使用多種業務場景的全域性解決方案。

小雷FansUnion
2015年10月26日
湖北-武漢-循禮門 
微信:FansUnion
QQ:240370818 

相關文章