使用数据库存放图片
浏览:4188次 出处信息
图片是网站上很重要的资源,用户发布的产品图片,用户的logo,AV男,兽兽女,犀利哥等等等等,一个稍具规模的网站,图片的数量可能是千万级,这种资源的特点就是文件小,数量大,每个文件在几字节到几K不等,所以针对图片的访问,基本是非常离散的IO,考验的是系统的磁盘并发和CPU处理能力
一般网站,图片都是存放专门的图片服务器,可集中也可以分布式,比如有条件的可以购买昂贵的NAS存储,由主机拖着,以NFS或者HTTP的方式,供前面的应用
访问,或者使用多台廉价PC,图片分布打散到每个机器,前台应用解决图片存取和访问策略,以便充分利用所有资源,在应用与图片服务器中间还可能加一层cache,来缓冲前台的访问压力
上面所说的方法,弊端是有很多的
1.文件系统一定是要使用的,为了管理数千万的图片,必须进行目录分层,因为一个目录下不可能存放太多的文件,前期的目录规划要考虑后期的扩展,
还有图片分布均匀,这样做下来,往往目录的深度会达到5层甚至7层
2.数据迁移,备份怎么做?高级的NAS存储,有自己的卷复制,但这个粒度太粗,如果要细分到底层或中间层,会有点力不从心,对于这种大数据量的
小文件拷贝,PC也是非常吃力
3.每一个图片的访问,基本会做5-7次的目录跳转,转换到磁盘,也可能有10次物理IO了,在并发量上来的时候,磁盘会是个瓶颈,当然,分布式是个方向
这里想到了另外一种方法,利用数据库来存放图片,存储的方式就是现在最流行的key-value
create table mypic
(
key number not null,
pic blob
);
create index ind_picid on mypic(key);
key是图片名称,事先最好统一规划一下,使用number数字来命名,并针对key建立索引
VALUE就是图片内容,用blob来保存
访问一个图片的方式就是:
获取图片名称 数据key
走key上的索引,定位到记录表记录
根据表记录,定位到图片的blob,并读取
这个方法的优点:
1.单个图片的访问路径缩短,数字索引比较小,分区做的好的话可能小到两层,从索引到表,到blob段,大概是4-5跳
并且KEY是区分度非常高的数据类型,在索引每层的横向检索中,不会超过1个数据块,而文件目录结构中,子目录繁多,
要遍历这层的inode后,才知道具体跳转的下层位置
2.备份方式比较灵活,可以基于整个数据库,或者单独的表,数据的迁移,删除,都是基于表级别的,比较直观,方便
3.可以在数据库层面,考虑图片的水平拆分,垂直拆分,分表,分库,都不错
4.数据库的复制技术可以派上用场,读写分离
这里数据库完全是当成一个KEY-VALUE的存储在用,我们可以考虑将一些廉价的PC堆在一起,做成一个picdb的群集,
建议继续学习:
- 图片动态局部毛玻璃模糊效果的实现 (阅读:13592)
- 淘宝图片存储架构 (阅读:9840)
- GFS, HDFS, Blob File System架构对比 (阅读:9386)
- 解决IE6从Nginx服务器下载图片不Cache的Bug (阅读:7101)
- When we`re only No.2, we try harder之聊天表情设计小探讨 (阅读:6511)
- 精于图片处理的10款jQuery插件 (阅读:6223)
- phpThumb:强大的缩微图类 (阅读:5462)
- js实现预加载图片让图片快速显示 (阅读:4963)
- 利用开源的Gearman框架构建分布式图片处理平台[原创] (阅读:4262)
- 通过php+imagick 创建PDF图片预览 (阅读:3794)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:让数据解析能够做到向前向后完全兼容(最近做项目总结)
后一篇:LightCloud的设计原理 >>
文章信息
- 作者:八神 来源: 八神
- 标签: blob 图片
- 发布时间:2010-03-12 09:15:08
建议继续学习
近3天十大热文
- [57] IOS安全–浅谈关于IOS加固的几种方法
- [56] Oracle MTS模式下 进程地址与会话信
- [55] 图书馆的世界纪录
- [54] android 开发入门
- [53] 如何拿下简短的域名
- [52] Go Reflect 性能
- [51] 【社会化设计】自我(self)部分――欢迎区
- [48] 读书笔记-壹百度:百度十年千倍的29条法则
- [39] 程序员技术练级攻略
- [34] 视觉调整-设计师 vs. 逻辑