图片系统架构思考之一:删除图片--不容忽视

对于一个网站系统,图片的处理往往是一个不可或缺的事情,不管是淘宝还是京东,每天都有大量的产品上架、下架,其中就涉及到了大量图片的管理。比如很简单的一个产品表,里面有:产品ID、产品名称、产品图片 字段,此时应该怎么保存产品图片呢? 一种方式是将图片保存到数据库里面,采用blob类型的字段,此时该字段的内容就是图片的二进制表示;另外一种方式是将图片保存到普通的文件系统上,比如windows或者linux的分区上,在数据库的相应字段中保存的是该图片文件的路径信息,该模式的一个简单示意图如下:当客户端要显示产品信息的时候,Web服务会从数据库中提取产品表的信息,然后客户端浏览器会将【产品图片】这个字段内容以URL方式通过HTTP协议获取(当然在该方式下,数据库中的【产品图片】并不是类似于d:imagesA.jpg,而是一个类似http://www.test.com/images/A.jpg 的URL)。

实际上不管是淘宝还是京东,技术实现上都采用了第二种的方式:比如京东的某个图书的介绍图片--http://img10.360buyimg.com/jdcms/s150x150_jfs/t841/219/1032027851/275521/99994992/5566b9efNb8b54bdd.jpg   ,淘宝与此类似。 当然淘宝、京东在图片管理方式上,并不会像上图描述的那么简单,他们在图片方面还做了很多的工作,比如:图片压缩、图片多张缩略图或者实时生成多种尺寸的缩略图、图片的存储管理等; 比如 淘宝的图片存储架构设计:http://wenku.baidu.com/link?url=AkgMvSKGr5ScPQhJ9g8273Rl-1BEmJW9QzcLoFnaRgx9FEEwhuZt2x-KKM-2ChIA2E9jMlDaDFd5eyi35lAPgAMYJJzPRj7-8FdG2Z4n2dK 

就对此做了比较详细的描述。

应该说第二种方式也比较符合实际的应用,对于图片管理,可以自行开发分布式的文件系统来管理,比如TFS,而且在图片的压缩、图片生成缩略图方面都可以做到很好的灵活性。目前我们的系统架构也采用了该种方式,当然我们还没有用上TFS等,因为我们是一个小网站,哈哈。

但是在实际的使用中我们也发现了一个严重的问题,怎么删除图片? 随着图片数量的不断增多,对硬盘的容量提出了要求,因此我们需要考虑是否对废弃的图片做删除处理

简单测试了一下淘宝的产品评价,发现淘宝根本就没有删除图片,比如我对一个产品进行评价,选择了一张图片上传,此时会生成一个图片的url,而且图片也确实显示在网页上了(后台应该是生成并保存了一张图片);然后在保存评价之前直接点其它页面,对该产品不做评价了,但是那个图片的url还是可以打开,可以看到图片的。根据该想法,如果我是一个恶意用户,完全有可能通过脚本不停的上传图片,哈哈,是否有一天会撑爆淘宝的图片服务器呢?

从普通的应用来讲,比如产品管理,可能会有产品的新增、产品的修改,产品的删除,其实这里面就包含了图片的新增、图片的修改、图片的删除,此时我们应该怎么做?

一种方式是对旧图片不做处理,比如淘宝:产品新增的时候增加图片,产品修改、删除的时候继续增加图片,而对原来的图片不做处理 (淘宝是否真的对图片不做处理?--不知道,可能淘宝在后台会有一些算法,将废弃的图片给删除掉;或者淘宝可能把图片先放置到缓存或者临时的存储系统,如果用户没有确认、超时,这些图片就不会被真正的存储到实际系统中)

另外一种方式是及时删除旧图片,比如:产品修改--图片A换成了图片B,那么除了修改数据库里面的url,还需要将原来图片A删除掉; 产品删除--除了删除数据库的记录之外,还需要删除图片A;总之这个工作需要较多的I/O操作,而且如果一个字段可能包含多张图片url的时候,还需要多次删除。该方式需要开发人员编写相应的删除代码,但是对硬盘的容量做了较好的控制。

图片管理是一个复杂的事情,对外提供高性能的图片访问需要好好的规划图片的整体架构,并做好图片的增、删、改等工作。

原文地址:https://www.cnblogs.com/NB-CTO/p/4634128.html