前言
上一篇文章《使用Golang语言实现对指定存储桶的删除方法(上)》中介绍了删除存储桶前的校验逻辑,今天就来看一看,具体删除存储桶时的逻辑处理。通过上下两篇文章的介绍基本上就把删除存储桶的底层源码实现讲清楚了。
正文
我们直接进入正题,当删除存储桶时,大概需要三个层逻辑。具体情况,我们接下来单独介绍。
第一层
存储桶中一般会包含存储的文件,我们在删除存储桶的时候,首先要删除存储的文件。我们通过查询数据库,查看当前存储桶中都包含哪些存储文件,然后根据查询结果再逐一删除。
代码实现:先调用ListObjectsV2()
查询存储的文件,再调用删除接口RemoveObject()
。
第二层
存储桶中还有可能会包含正在上传的文件,比如大文件一般都是分片上传的,有可能正上传了一半停止了。在删除存储文件时,也要考虑删除这部分中间文件。同样,我们先查询数据库中未完成上传的记录,再根据这些查询结果删除中间的临时文件。
代码实现:先调用ListIncompleteUploads()
查询未完成上传的文件,再调用删除接口RemoveIncompleteUpload
。
第三层
删除存储桶中所有的文件和临时文件后,就可以删除存储桶本身了。最后,删除数据库中的存储桶记录。
代码实现:调用接口RemoveBucket
删除存储桶。
逻辑汇总加代码实现
定义删除方法:cleanupBucket
,参数是存储桶名称,类型是字符串。具体逻辑代码实现如下:
funccleanupBucket(bucketNamestring) error { // 创建协程doneCh :=make(chanstruct{}) // 退出后清理资源deferclose(doneCh) // 迭代查询结果forobjCh :=rangeListObjectsV2(bucketName, "", true, doneCh) { ifobjCh.Err!=nil { returnobjCh.Err } ifobjCh.Key!="" { // 删除存储桶中的文件err :=RemoveObject(bucketName, objCh.Key) iferr!=nil { returnerr } } } // 查询未完成上传的文件,也就我们说的中间文件、临时文件forobjPartInfo :=rangeListIncompleteUploads(bucketName, "", true, doneCh) { ifobjPartInfo.Err!=nil { returnobjPartInfo.Err } ifobjPartInfo.Key!="" { // 删除未完成上传的文件err :=RemoveIncompleteUpload(bucketName, objPartInfo.Key) iferr!=nil { returnerr } } } // 最后,删除存储桶自己err :=RemoveBucket(bucketName) iferr!=nil { returnerr } returnerr}
好了,至此,删除存储桶的底层代码逻辑实现就介绍完了。看完了之后,是不是有很多点是自己之前所没有想到的。
结尾
通过学习删除存储桶的底层代码实现,有没有感觉像发现了新大陆。尽管平时我们自己不去实现这些代码,但是其中的思想有很多可以借鉴的地方。今天的内容就介绍完了,我是 liuzhen007, 欢迎评论留言外加“一键三连”。
题外话
今天不得不再说点别的,细心的小伙伴会发现,我这个月每天都在更新文章,而且在每篇文章的最后都会附上一个打卡截图。今天是这个月的最后一天,8月更文挑战,今天就算完成了。哈哈,特意在此记录一下。今天是一个活动的结束,也是新活动的起点,继续加油!奥力给!
作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!😄