ruby-fog:在少于 3 个请求的情况下从对象存储中删除一个项目
ruby-fog: Delete an item from the object storage in less than 3 requests
我开始在一个项目中使用雾存储。我做最简单的动作:上传一个对象,获取对象,删除对象。我的代码看起来像这样:
storage = get_storage(...) // S3 / OpenStack / ...
dir = storage.directories.get(bucket) # 1st request
if !dir.nil?
dir.files.create(key: key, body: body) # 2nd request
# or:
dir.files.get(key) # 2nd request
#or
file = dir.files.get(key) # 2nd request
if !file.nil?
file.destroy # 3rd request
end
end
在所有情况下,第一步都是获取目录,它向存储引擎发出请求(如果目录不存在,它 returns 为零)。
然后还有一个步骤可以做我想做的任何事情(如果删除,中间甚至还有第 3 步)。
但是,如果我看一下 Amazon S3 API,很明显删除一个对象不需要向 amazon 发出 3 个请求。
有没有办法在使用雾的同时减少对存储提供商的请求?
我认为这已经在邮件列表中得到了答复,但是如果您在 directories/files 上使用 #new
,它只会给您一个本地参考(对比 #get
进行查找).这应该可以满足您的需求,但如果文件或目录不存在,它可能会引发错误。
像这样:
storage = get_storage(...) // S3 / OpenStack / ...
dir = storage.directories.new(key: bucket)
dir.files.create(key: key, body: body) # 1st request
# or:
dir.files.get(key) # 1st request
#or
file = dir.files.new(key)
if !file.nil?
file.destroy # 1st request
end
以这种方式工作应该允许 3 种模式中的任何一种在单个请求中工作,但如果存储桶不存在可能会导致错误(因为尝试将文件添加到不存在的存储桶是错误的) .所以它更有效,但需要不同的错误处理。相反,如果您需要确定,您可以提出额外的要求。
我开始在一个项目中使用雾存储。我做最简单的动作:上传一个对象,获取对象,删除对象。我的代码看起来像这样:
storage = get_storage(...) // S3 / OpenStack / ...
dir = storage.directories.get(bucket) # 1st request
if !dir.nil?
dir.files.create(key: key, body: body) # 2nd request
# or:
dir.files.get(key) # 2nd request
#or
file = dir.files.get(key) # 2nd request
if !file.nil?
file.destroy # 3rd request
end
end
在所有情况下,第一步都是获取目录,它向存储引擎发出请求(如果目录不存在,它 returns 为零)。
然后还有一个步骤可以做我想做的任何事情(如果删除,中间甚至还有第 3 步)。
但是,如果我看一下 Amazon S3 API,很明显删除一个对象不需要向 amazon 发出 3 个请求。
有没有办法在使用雾的同时减少对存储提供商的请求?
我认为这已经在邮件列表中得到了答复,但是如果您在 directories/files 上使用 #new
,它只会给您一个本地参考(对比 #get
进行查找).这应该可以满足您的需求,但如果文件或目录不存在,它可能会引发错误。
像这样:
storage = get_storage(...) // S3 / OpenStack / ...
dir = storage.directories.new(key: bucket)
dir.files.create(key: key, body: body) # 1st request
# or:
dir.files.get(key) # 1st request
#or
file = dir.files.new(key)
if !file.nil?
file.destroy # 1st request
end
以这种方式工作应该允许 3 种模式中的任何一种在单个请求中工作,但如果存储桶不存在可能会导致错误(因为尝试将文件添加到不存在的存储桶是错误的) .所以它更有效,但需要不同的错误处理。相反,如果您需要确定,您可以提出额外的要求。