需要用户上传图片场景,比如传头像、发朋友圈,可能会遇到这些情况:
用户上传后,编辑内容,删掉原有的图片;
部分图片上传失败,导致用户又重新上传了一遍;
用户换头像;
...
等等情况,会导致服务器上存在用不着的冗余文件,浪费存储空间。
大家一般都是怎么处理这些情况的?
![]() | 1 felinx 2020-06-12 14:39:51 +08:00 原始上传文件留个记录表,对于没有被正确关联引用到的,即可判断的不可能再被用到的可以清理掉。 用户换头像这种不一定,有些 APP 则有旧头像记录的。 原则就是可断定的无用的则可清除。 |
2 CodingNaux 2020-06-12 14:41:32 +08:00 via iPhone md5 ? |
3 2kCS5c0b0ITXE5k2 2020-06-12 15:06:08 +08:00 随表单上传咯. |
![]() | 4 mostkia 2020-06-12 15:09:12 +08:00 一般直接替换文件吧。数据库内绑定图片的唯一 ID,然后用户如果需要替换,直接更新数据库里储存的 ID,同时删除旧的 ID 对应的文件。 |
5 lilydjwg 2020-06-12 15:12:41 +08:00 refcount 呗。或者你搞 mark-sweep gc 啥的也行。 |
![]() | 6 also24 2020-06-12 15:13:29 +08:00 说真的,这些图片直接存起来可能成本更低 |
![]() | 7 mokeyjay 2020-06-12 15:14:58 +08:00 一般就是让它冗余着 |
8 BlackBerry999 2020-06-12 16:36:53 +08:00 md5 |
![]() | 9 kera0a 2020-06-12 17:00:50 +08:00 via iPhone ![]() 感觉没必要处理,多占不了多少资源。等产品倒闭了一起删就行。 |
![]() | 10 zzzmh 2020-06-12 17:11:09 +08:00 举个例子,专门有一张 oss 表记录所有问题,如果是现在有一张头像,用户更新了一个新的头像,旧的就先软删除掉,然后 30 天没关联到任何地方且已软删除的,就连数据带文件一起删掉。也就只能做到这一步了。浪费是肯定存在的。 |
11 shuangya 2020-06-12 17:42:43 +08:00 via Android 公司一般也不在意那点空间…… 实在在意的话,只有在某个地方记一下,然后定期清理…… |
![]() | 12 xuanbg 2020-06-12 17:54:34 +08:00 链接和文件是引用关系,对于哈希值相同的文件来说,冗余的不过是个链接罢了。 |
![]() | 13 John60676 2020-06-12 17:58:27 +08:00 现实是会存在不同文件,但是 MD5 相同的情况的... |
![]() | 14 caola 2020-06-12 18:06:19 +08:00 |
![]() | 15 clino 2020-06-12 18:19:55 +08:00 via Android 用 sha256 之类的命名文件,可以防止存多份重复文件 |
![]() | 16 sujin190 2020-06-12 18:24:23 +08:00 如上所说,文件名用 hash,保证相同文件只存一份,其他的就无所谓了啊,反正现在磁盘页不值钱,删它干嘛 |
![]() | 17 jugelizi 2020-06-12 19:26:33 +08:00 via Android ...第一 磁盘真不值钱 然后 头像地址可以用用户信息 hash 算出来 永远只有一张图片存在 至于发布的图片删除了 可以监控图片日志 冷数据移走 |
![]() | 18 zsdroid 2020-06-12 21:18:49 +08:00 相对于流量来说,存储空间的费用可以忽略不计。 |
![]() | 19 imdong 2020-06-12 22:10:56 +08:00 via Android 意义不大但真的坐过这个需求,我安排给一个新来的程序员做了。 他用了一个月的时间,这是我最痛苦的一个月… 因为他研究了一个星期,也不知道该咋整。 然后我说用 md5 存数据库就好了, 然后又一个星期过去了。还没搞定。 原来,md5($_FILE[0]->name),然后直接写到数据库了… 先不说对系统随机的文件名取 md5 的问题,他么存数据库也没有查是否存在… 我都懵逼了…………程序员可以有多菜??? |
20 zqx 2020-06-12 22:21:37 +08:00 via Android 操作系统是如何清理内存的? |
21 daozhihun 2020-06-12 22:28:43 +08:00 最靠谱的就是不管它,浪费就浪费,没多少钱。 如果真有需求要清理掉,其实比较好处理: 定期任务:把所有图片的文件名和 hash 找出来,然后去比对数据库里有没有(数据库可以存文件名和 hash,在保存表单的时候),没有的就删掉。 为了不影响系统正常的运转,可以分散在半夜里运行,并且可以只清理一年以前的。 ------ 不过我还是觉得不要处理比较好,等你的存储真的不够了,你的产品应该赚了很多很多钱了随便再怼个几百 T 的存储没多少钱;如果你的新存储怼不起,很可能公司就要关门了 |
22 TransAM 2020-06-12 23:09:08 +08:00 via Android 每个用户的每个唯一图片起个名字,不要用 hash,比如用户头像就是 <uid>_icon 。写的时候直接覆盖这个文件。 |
![]() | 23 JamesR 2020-06-12 23:23:10 +08:00 我都专门写个算法,每次上传成功后,清理以前上传过的用不着的文件。就是开发这个功能要稍微多花点时间。 |
![]() | 25 BigDogWang 2020-06-13 12:54:57 +08:00 via iPhone 对象存储默认生命周期一天后删除,用户确认了的提交会去掉这个删除的定时 |