博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
8.3. 数据库与外界文件
阅读量:6860 次
发布时间:2019-06-26

本文共 3073 字,大约阅读时间需要 10 分钟。

你是是不是在开发中常常遇到,删除了数据库记录后,发现该记录对应的图片没有删除,或者删除了图片,数据库中仍有数据存在,你的网站脏数据(图片)成几何数增长,阅读下文这里为你提供了一个完美决方案。

8.3.1. 背景

我以电商网站为例,一般的网站产品数据存放在数据库中,商品图片是上传到文件服务器,然后通过http服务器浏览商品图片。这是最基本的也是最常见做法。

稍复杂的方案是,如果图片数量庞大,会使用分布式文件系统方案。但是这些方案都不能保证数据的完整性,极易产生脏数据(垃圾数据)。脏数据是指当你删除了数据库表中的记录后,图片仍然存在,或者手工删除了图片,而数据库中的记录仍然存在。

将图片放入数据库中存放在BLOB的方法可以解决脏数据问题,典型的案例是公安的身份证系统。但这种方案的前提是,图片不能太大,数量不多,访问量不大。 这显然不适合电商网站。

2009年我在走秀网工作,商品图片与缩图文件900GB到2012离职已经有10TB,每天有成百上千的商品上架下架,很多商品下架后永远不会再上架,这些批量下架的商品数据不会删除,仅仅标记为删除,总是期望以后能继续使用,实际上再也不会有人过问,另一方面随着品类经理频繁更换,员工离职,这些商品会石沉大海,再也无人问均。这些商品所对应的图片也就脏数据主要来源。新的品类经理上任后,会重新拍照,上传新图片。

总之,删除数据库中的数据不能将图片删除就会产生脏数据。很多采用删除数据的时候去检查图片如果存在先删除图片,再删除数据的方法。这种方案也非完美解决方案,存在这图片先被删除,程序出错SQL没有运行,或者反之。

8.3.2. 解决思路

如果删除图片能够成为事物处理中的一个环节,所有问题都能迎刃而解,可彻底解决脏数据的烦恼。

8.3.3. 解决方案

mysql plugin 开发 udf。我写几个function

UDF

image_check(filename)

检查图片是否存在.

image_remove(filename)

删除图片.

image_rename(oldfile,newfile)

更改图片文件名.

image_md5sum(filename)

md5sum 主要用户图片是否被更改过.

image_move(filename,filename)

移动图片的位置

有了上面的function后你就可以在begin,commit,rollback 直接穿插使用,实现在事物处理期间做你爱做的事。

8.3.4. plugin 的开发与使用

编译UDF你需要安装下面的软件包

sudo apt-get install pkg-configsudo apt-get install libmysqlclient-devsudo apt-get install gcc gcc-c++ make automake autoconf

编译udf,最后将so文件复制到 /usr/lib/mysql/plugin/

git clone https://github.com/netkiller/mysql-image-plugin.gitcd mysql-image-plugin/srcgcc -I/usr/include/mysql -I./ -fPIC -shared -o image.so image.csudo mv image.so /usr/lib/mysql/plugin/

装载

create function image_check returns boolean soname 'images.so';create function image_remove returns boolean soname 'images.so';create function image_rename returns boolean soname 'images.so';create function image_md5sum returns string soname 'images.so';create function image_move returns string soname 'images.so';

卸载

drop function image_check;drop function image_remove;drop function image_rename;drop function image_md5sum;drop function image_move;

8.3.5. 在事务中使用该插件

插入图片流程,上传图片后,通过插件检查图片是否正确上传,然后插入记录

begin;IF image_check('/path/to/images.jpg') THEN	insert into images(product_id,thumbnail,original) values(1000,'thumbnail/path/to/images.jpg','original/path/to/images.jpg');	commit;ELSE	image_remove('/path/to/images.jpg');END IFrollback;

删除商品采用image_move 方案,当出现异常rollback后还可以还原被删除的图片

begin;IF image_check('/path/to/images.jpg') THEN	select thumbnail,original into @thumbnail,@original from images where id='1000' for delete;	delete from images where id='1000';	select image_move(@thumbnail,'recycle/path/to/');	select image_move(@original,'recycle/path/to/');	commit;END IFrollback;select image_move('recycle/path/to/images.jpg','path/to/images.jpg');

我们可以使用EVENT定时删除回收站内的图片

image_remove('recycle/path/to/images.jpg');

8.3.6. 通过触发器调用图片处理函数

通过触发器更能保证数据完整性

1. insert 触发器的任务: 插入记录的时候通过image_check检查图片是否正常上传,如果非没有上传,数据插入失败。2. delete 触发器的任务: 检查删除记录的时候,首先去删除图片,删除成功再删除该记录。

触发器进一步优化

1. insert 触发器的任务: 插入记录的时候通过image_check检查图片是否正常上传,如果非没有上传,数据插入失败。如果上传成功再做image_md5sum 进行校验100% 正确后插入记录2. delete 触发器的任务: 检查删除记录的时候,首先去改图片文件名,然后删除该记录,最后删除图片,删除成功。如果中间环境失败 记录会rollback,图片会在次修改文件名改回来。100% 保险

原文出处:Netkiller 系列 手札

本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

你可能感兴趣的文章
如何充分利用云计算? 掌握这十大方法或许可以
查看>>
Gartner报告:大数据将在中国大行其道
查看>>
管理阶层是如何看待测试?
查看>>
Selenium—实现网页元素拖拽
查看>>
《Clojure数据分析秘笈》——3.5节将agent和STM结合使用
查看>>
微软纳德拉:科技有黑暗一面 开发者要慎用权力
查看>>
中国光伏市场风起云涌 单晶硅巨头开始了扩张计划
查看>>
《DBA修炼之道:数据库管理员的第一本书》——1.15节回顾
查看>>
Visual Studio之UI界面测试
查看>>
企业为什么需要IT配置管理及其如何使用
查看>>
《深入理解Spark:核心思想与源码分析》——3.13节创建DAGSchedulerSource和BlockManagerSource...
查看>>
Nginx 将增加动态模块,用户可修改服务器
查看>>
《Adobe Photoshop CS5中文版经典教程(全彩版)》—第1课1.7节检查更新
查看>>
《微课实战:Camtasia Studio入门精要》——2.3 录制屏幕
查看>>
码云周一见 | 老司机教你如何麻溜地搭建网站
查看>>
bingoJS 2.x | AmazeUI 后台 SPA 管理框架
查看>>
《NTFS文件系统扇区存储探秘》——导读
查看>>
一个易用的 WPF 自动完成文本框 【已翻译100%】
查看>>
红帽7000万欧元收购开源云计算商eNovance
查看>>
《Storm分布式实时计算模式》——1.5 理解数据流分组
查看>>