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风格的帖子,请使用草稿或将其设为私人。为什么麻烦删除用户的数据?