删除Blobstore孤儿

时间:2012-11-01 22:29:21

标签: google-app-engine python-2.7 google-cloud-datastore blobstore

从Blobstore中删除孤立blob的最有效方法是什么?

应用功能&范围:

  • (登录)用户想要创建包含一些正常的帖子 数据存储区域(例如名称,姓氏,注释)和blob(图像)。
  • 此外,blob会在resto之前异步上传 数据通过POST发送
    • 这样就很有可能让孤儿成为孤儿,例如,用户可能会因为某种原因上传图片而无法填写表格。通过在发送其余数据之前不使用blob的异步上载来最小化此问题,但是,此问题仍然存在于较小的范围。

可能但效率低下的解决方案:

  • 每当帖子完成(即发送其余数据)时,您将blob键添加到“used blobs”表中。然后,您可以经常运行一个cron,并将所有blob与“used blobs”表进行比较。那些已经在一小时前上传但尚未“未使用”的内容将被删除。
    • 我的理解是,运行可能数十万个blob密钥的列表并将其与数十万个“使用的blob密钥”的另一个表进行比较是非常低效的。

有没有更好的方法呢?我搜索了类似的帖子,但我找不到任何提及有效的解决方案。

提前致谢!

4 个答案:

答案 0 :(得分:3)

感谢您的评论。但是,我很了解这些解决方案,我发现它们效率太低。查询数千个被标记为“未使用”的条目并不理想。

我相信我已经想出了一个更好的方法,并希望听到你的想法:

保存blob后,会立即创建一个延迟任务,以便在一小时内删除相同的blob。如果创建并保存帖子,则删除延迟任务,因此不会在一小时内删除blob。

我相信这可以让您免于每小时查询数千个条目。

您对此解决方案有何看法?

答案 1 :(得分:1)

blob也有文件名。发布后,您可以删除所有具有相同文件名的旧blob。要删除的重复项必须具有相同的所有者或没有所有者。您还必须删除没有所有者的blob。

以下是上传后删除重复项的示例。

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

要清理“未使用”blob,您可以在每次上传后安排任务,在一小时后运行。

答案 2 :(得分:1)

您可以创建将blob链接到用户的实体。当用户上传blob时,您会立即创建一个包含blob id,用户ID(或post id)和创建时间的新记录。当用户提交帖子时,您向该实体添加一个标志,表示使用了一个blob。

现在你的cron作业需要获取这种标志不等于“true”的所有实体,并且创建时间超过一小时。此外,您只能获取密钥,这是一个更有效的操作,可以获取完整的实体。

答案 3 :(得分:0)

使用草稿!每次上传后保存为草稿。然后不要做清洁!让用户自己选择消灭。

如果您计划使用Facebook风格的帖子,请使用草稿或将其设为私有。为什么要删除用户的数据?