Doms开发日记

Doms系统开发过程中的点滴

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  22 Posts :: 0 Stories :: 213 Comments :: 4 Trackbacks
在上一篇(http://www.cnblogs.com/uubox/archive/2008/07/14/1242588.html)中介绍了ThumbCached的功能和使用方法,这篇主要介绍如何利用ThumbCached储存和优化相册网站中的缩略图。

为什么要用ThumbCached或者这类的程序来保存缩略图呢?

假如你正在做一个相册或带有相册功能的网站,相信第一个想到的问题是如何保存大量用户上传的照片文件。首先想到的可能是用一个大硬盘来解决咯,现在1TB的硬盘才1.5K左右,买3个做成RAID5,划分个目录出来保存所有的照片文件,问题就轻松解决了。假如过了几个月,你的网站莫名其妙地热起来,这三个硬盘的数据快爆了,这时候怎么办呢?再加3个硬盘,加到服务器机箱塞满硬盘为止,呵呵。如果所有硬盘都爆了,这时应该考虑使用分布式的文件系统(DFS)了,否则系统的扩展和数据的迁移会很头痛。DFS软件有很多可以选择,收费免费开源闭源的都有。好了,现在原始照片文件储存问题解决了,接下来看看缩略图的情况,一般相册都会对一张照片生成1个小尺寸的缩略图以供站内浏览,同时还会生成其他3、4个尺寸的小图以供到blog或论坛贴图,我们可以把这些网站产生的文件统统都存到DFS里。不过对于最小那个缩略图似乎可以优化一下,因为它们被高频率访问,同时它们很小(48*48像素的jpeg文件一般在2KB左右),大量这些文件会浪费部分磁盘空间。如果我们把这些小家伙用专门的一台服务器来装起来,并加个缓冲,再用一个轻量级的http服务程序来喷这些小数据,似乎是一个不错的优化策略。

ThumbCached本来的用途就像上段所述那样,被设计来做小缩略图的缓冲,以试图优化一些高访问率的网站(可惜的是这个组件所属的项目并没有预期的高访问量,做网站和做技术并不是一回事啊,呵呵,扯远了) ,要注意它不是文件系统,不能当成文件系统用哦。

当用户上传完照片之后,后台程序压缩并得到小缩略图,通过类似下面的代码保存到Thumbcached里。

        /// <summary>
        
/// 保存缩略图,在用户上传完照片之后调用
        
/// </summary>

        public void Save(long fileId,  DateTime lastModifyTime, Stream stream)
        
{
            
//NOTE::stream为小缩略图文件的数据流

            
//实例化ThumbCached的客户端
            TCClient thumbClient = new TCClient("tcd001");
            thumbClient.Add(fileId, stream.ToArray(), lastModifyTime);
        }


而在轻量级http服务程序里,读取Thumbcached里头的数据的代码大致如下:

/// <summary>
        
/// 向客户端浏览器传送缩略图
        
/// </summary>
        
/// <param name="fileId"></param>

        public void Show(long fileId)
        
{
            
//NOTE::这里的Response应该是轻量级http服务程序中负责响应的对象。
            
//这里使用了asp.net的Response的风格是为了说明大概的步骤.
            
//下面的Request同样的意思。

            Response.ClearContent();
            Response.ContentType 
= "image/jpeg";

            
//判断日期
            string lastModified = Request.Headers["If-Modified-Since"];
            DateTime lm 
= DateTime.MinValue;
            
if (DateTime.TryParse(lastModified, out lm))
            
{
                lm 
= lm.ToLocalTime();
            }


            
//实例化ThumbCached的客户端
            TCClient thumbClient = new TCClient("tcd001");
            
try
            
{
                
//尝试从缓存中获取缩略图,并返回至用户浏览器
                string tbKey = fileName + "-" + sizeType;
                ThumbBlock imgBlock 
= thumbClient.Get(tbKey, lm);
                Response.AppendHeader(
"Last-Modified", imgBlock.LastModifyTime.ToUniversalTime().ToString("r"));
                Response.BinaryWrite(imgBlock.Data);
            }

            
catch (BlockNotFoundException)
            
{
                Response.StatusCode 
= 404;
            }

            
catch (BlockNotModifyException ex)
            
{
                
//被请求的内容在指定的时间之后没有发生改变
                Response.AppendHeader("Last-Modified", ex.LastModifyTime.ToUniversalTime().ToString("r"));
                Response.StatusCode 
= 304;
            }

            
catch
            
{
                Response.StatusCode 
= 500;
            }


            Response.End();
        }

慢着,ThumbCached本身不是内置http服务吗?为什么不直接拿他对外喷图片数据,还需要再外加一层http服务呢,这是因为有时网站可能会有一些权限控制,将网站内部的数据完全暴露应该不是一个很好的做法。


后记,发布此组件纯粹为了共享交流(包括编程和代码),请不要拿它来较真:)包括这篇文章提到的优化方案是否真实有效,呵呵。
最后,如果发现有错误或者有建议,可以回复此帖或email或到讨论组:http://groups.google.com/group/thumbcached 讨论。



posted on 2008-07-16 02:39 kwanhong young 阅读(1549) 评论(8)  编辑 收藏

Feedback

#1楼  2008-07-16 07:25 <∩扫地僧∩>      
很不错的文章,受用了!
  回复  引用  查看    

#2楼  2008-07-16 08:41 玉开      
关键实现部分被一笔带过了,这样不好吧。
  回复  引用  查看    

嗯,用MemCached缓存其它数据,用ThumbCached缓存图片及文件,很不错噢!
  回复  引用  查看    

#4楼  2008-07-16 09:31 飄lá┽蕩去      
我不懂的是到底缓存在哪个地方了,缩略图依然是在硬盘吗?还是部分高频的在内存里,没命中就去读硬盘?

难道只是为了把缩略图集中管理,节省空间
  回复  引用  查看    

#5楼 [楼主] 2008-07-16 10:50 kwanhong young      
@4
可以大致认为:ThumbCached = 缓存 + 储存
高访问的数据会放到缓存里,不活跃的数据就从缓存中移除,不同于内存式缓存系统的是,被移除的数据并不是从此就消失,它被转存到自己的(位于硬盘的)文件里头了,下次再次被访问时,它会从自己文件里调出,特别地,如果原始数据是要通过网络文件系统获取的话,那么从自己文件里调出数据会更快一些。

可能跟新浪的memcachedb有些类似,不过我没有详细研究过
  回复  引用  查看    

#6楼  2008-07-17 08:38 菜无罪1      
这个东西最大可以支持多少g?
  回复  引用  查看    

#7楼 [楼主] 2008-07-17 09:31 kwanhong young      
@6
视文件所在的分区对单个文件最大的支持是多少,例如NTFS是64G。如果每个小缩略图算5KB的话,大约最多存600万个小缩略图。
  回复  引用  查看    

#8楼  2008-07-17 10:46 菜无罪1      
好。。多谢了,我想使用一下
  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-16 02:55 编辑过