2

從Blobstore中刪除孤兒blob的最有效方法是什麼?刪除Blobstore孤兒

應用功能&範圍:

  • A(登錄)用戶想要創建一個包含某些正常 數據存儲字段(例如姓名,註釋)和斑點(圖像)的柱。
  • 此外,斑點在數據的Resto餐廳 之前異步上傳通過POST
    • 這使得有孤兒,例如,用戶可以上傳圖片,但不能完成的一個很好的機會被髮形式出於某種原因。通過在發送剩餘數據之前不使用blob的異步上傳,可以最大限度地減少此問題,但是,這個問題仍然存在於較小的範圍內。

可能的,但效率不高的解決方案:

  • 每當後完成(即數據的其餘部分被髮送),你的BLOB鍵添加到「一表使用斑點「。然後,您可以每隔一段時間運行一次cron,並將所有的斑點與「使用斑點」表進行比較。那些已經在一個小時前上傳但尚未使用的內容被刪除。
    • 我的理解是,通過潛在數十萬個blob密鑰的列表並將其與成千上萬個「使用的blob密鑰」的另一個表進行比較是非常低效的。

是否有這樣做的沒有更好的辦法?我已經搜索過類似的帖子,但我找不到任何有效的解決方案。

在此先感謝!

回答

3

感謝您的意見。但是,我很好地理解了這些解決方案,我發現它們效率太低。爲那些被標記爲「未使用」的成員查詢數千條條目並不理想。

我相信我已經想出了一個更好的辦法,並想聽聽就可以了您的想法:

當斑被保存,立即被創建延期任務刪除同樣的斑點在一個小時的時間。如果創建並保存了該帖子,則延遲任務將被刪除,因此該塊在一小時內不會被刪除。

我相信這可以讓你不必每隔一小時查詢數千個條目。

對此解決方案有何看法?

+0

1000萬個密鑰查詢僅需6美元(2016年2月)。這是1,141年的價值,每小時1次。您的解決方案可能更昂貴。 –

1

一個blob也有一個文件名。在帖子後,您可以刪除所有具有相同文件名的舊斑點。要刪除的副本必須擁有相同的所有者或沒有所有者。您還必須刪除沒有所有者的Blob。

以下是上傳後刪除重複項的示例。

blobs = blobstore.BlobInfo.gql("WHERE filename = '%s'" %(filename)) 
for blob in blobs : 
    if blob.key() != userdata.blob_ref.key() : blob.delete() 

要清理「不使用」斑點,你可以在每次上傳後,計劃任務,一個小時後運行。

+1

您假設用戶永遠不會使用同名文件(例如「Picture.jpg」) –

+0

我不知道您的商業案例,但我確定您可以找到解決方案,因爲您必須決定如果它是一個新文件或一個新版本。 – voscausa

1

您可以創建一個將blob鏈接到用戶的實體。當用戶上傳blob時,您立即使用blob id,用戶標識(或帖子ID)和創建時間創建一條新記錄。當用戶提交帖子時,您會爲此實體添加一個標誌,指示使用了斑點。

現在,您的cron作業需要獲取此類標誌不等於「true」且創建時間比一小時前更多的所有實體。此外,您只能獲取密鑰,這是一種更高效的操作,可以獲取完整的實體。

0

使用草稿!在每次上傳後保存爲草稿。那麼不要做清潔!讓用戶自己選擇消滅。

如果您正在計劃Facebook風格的帖子,請使用草稿或將其設爲私人。爲什麼麻煩刪除用戶的數據?