详解MongoDB实现存储物理文件和SQUID加速

之前在阅读">MongoDB GFS文档时,学习了它如何存储物理文件(包括大文件)的方式。为了加深印象,专门写了一个上传文件存储到Mongodb的示例。当然后因为是存储到文档数据库中,所以就不能用普通方式来访问这些物理文件了,这里又专门写了一个aspx页面专门读取这些文件(比如图片或MP3等),所以下载示例之后会看到两个页面,一个是uploadfile.aspx(上传),一个是getfile.aspx(从mongodb中把文件以流的方式读出来)。当然考虑到访问速度,这里还引入了SQUID来进行文件加速(当前SQUID默认只缓存静态文件,所以这里要对ASPX页面的输出进行一下设置,这些都会在本文中进行介绍)

首先介绍一下开发环境,我使用的是VS2008+SP1 ,mongodb客户端软件用的是samus-mongodb(最新版本即可)

添加对下面名空间的引用

using MongoDB;  using MongoDB.GridFS; 

下面是上传文件的主要代码:

uploadfile.aspx.cs

HttpPostedFile myFile = FileUpload.PostedFile;       int nFileLen = myFile.ContentLength;              byte[] myData = new Byte[nFileLen];       myFile.InputStream.Read(myData, 0, nFileLen);              GridFile fs = new GridFile(DB, filesystem);        Random random = new Random(unchecked((int)DateTime.Now.Ticks));   string newfilename = string.Format("{0}{1}{2}", random.Next(1000, 99999), random.Next(1000, 99999), System.IO.Path.GetExtension(myFile.FileName));       GridFileStream gfs = fs.Create(newfilename);       gfs.Write(myData, 0, nFileLen);       gfs.Close(); 

这里只是给上传文件起个随机名称,这样如果一切正常,就可以在数据库中找到该文件了,如下图:

下面看一下如何访问上传的物理文件getfile.aspx.cs(通过传递filename参数,mongodb中相应字段结构,如上图):

protected void 
Page_Load(object sender, EventArgs e)       {           if (!string.IsNullOrEmpty(Request.QueryString["filename"]))           {               string filename = Request.QueryString["filename"];               Init();               String filesystem = "gfstream";                GridFile fs = new GridFile(DB, filesystem);               GridFileStream gfs = fs.OpenRead(filename);                Byte[] buffer = new Byte[gfs.Length];  HttpContext.Current.Response.AddHeader("Expires", DateTime.Now.AddDays(20).ToString("r"));               HttpContext.Current.Response.AddHeader("Cache-Control", "public");                      // 需要读的数据长度               long dataToRead = gfs.Length;               int length;               while (dataToRead > 0)               {                   // 检查客户端是否还处于连接状态                   if (HttpContext.Current.Response.Is
ClientConnected)                   {                       length = gfs.Read(buffer, 0, 10000);            HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);                       HttpContext.Current.Response.Flush();                       buffer = new Byte[10000];                       dataToRead = dataToRead - length;                   }                   else                  {                       // 如果不再连接则跳出死循环                       dataToRead = -1;                   }               }               gfs.Dispose();               HttpContext.Current.Response.End();           }       } 

下面就是以列表的方式从mongodb中检索文件列表的最终的运行效果:

尽管MONGODB的并发性能很不错,但每次都去mongodb取的话也是有性能损耗的,特别是对于不经常变化的物理文件,所以这里使用了SQUID来进行文件缓存。当前SQUID默认只支持静态文件,对于本示例中的ASPX页面输出的流信息来缓存还要进行一下设置。

首先,如果在squid.conf文件中有如下行,需要用#进行注释(它会禁止缓存所有带?的链接地址):

hierarchy_stoplist cgi-bin ? \.php \.html  acl QUERY urlpath_regex cgi-bin \? \.php \.html     cache deny QUERY 

这样,再修改一下相应的.aspx,并在Header中添加如下信息,即:

HttpContext.Current.Response.AddHeader("Expires", DateTime.Now.AddDays(20).ToString("r"));  HttpContext.Current.Response.AddHeader("Cache-Control", "public"); 

这样SQUID就会忠实在根据该头信息来CACHED相应文件了。

当然也可以用如下方式来让指定那些文件aspx文件才会被SQUID CACHED:

acl CACHABLE_PAGES urlpath_regex \getfile.aspx     #允许cache上面的aspx页面     no_cache allow CACHABLE_PAGES 

而下面一个acl匹配所有的动态页面并禁止缓存所有aspx页面

#acl NONE_CACHABLE_PAGES urlpath_regex \? \.aspx         #禁止cache其它的aspx页面      #no_cache deny NONE_CACHABLE_PAGES 

下面几行设置页面cache的时长,第一行cache一天,第二行cache两分钟

refresh_pattern ^http://10.0.4.114:1100/mongodbsample/getfile.aspx 1440 0% 1440 ignore-reload  refresh_pattern ^http://10.0.4.114:1100/mongodbsample/getfile.aspx 2 0% 2 ignore-reload 

如要SQUID配置正确的话,只要访问SQUID所请求代理的站点(本文中为http://10.0.4.85:8989/mongodbspame/uploadfile.aspx),这里它就会到http://10.0.4.114:1100/mongodbspame/uploadfile.aspx去获取页面信息,同时对该页面中的链接getfile.aspx文件均会进行缓存,如下图:

好了,今天的内容就先到这里了,示例源码及SQUID配置文件下载链接:/Files/daizhj/mongodbsample.rar

时间: 2024-09-13 13:54:09

详解MongoDB实现存储物理文件和SQUID加速的相关文章

详解MongoDB管理命令_MongoDB

MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表:而每个集合中可以存储一组由列标识的记录,列是可以自由定义的,非常灵活,由一组列标识的实体的集合对应于关系数据库表中的行.下面通过熟悉MongoDB的基本管理命令,来了解MongoDB提供的DBMS的基本功能和行为.  MongoDB命令帮助系统  在安装MongoDB后,启动服务器进程(mongod),可以通过在客户端命令mongo实现对MongoDB的管理和监控.看一下

详解Java中的File文件类以及FileDescriptor文件描述类_java

File File 是"文件"和"目录路径名"的抽象表示形式. File 直接继承于Object,实现了Serializable接口和Comparable接口.实现Serializable接口,意味着File对象支持序列化操作.而实现Comparable接口,意味着File对象之间可以比较大小:File能直接被存储在有序集合(如TreeSet.TreeMap中).1. 新建目录的常用方法方法1:根据相对路径新建目录. 示例代码如下(在当前路径下新建目录"d

详解Android开发之MP4文件转GIF文件_Android

一 基本实现原理 在介绍具体实现过程之前,先简单说下基本原理和实现步骤,在解决相对比较复杂的问题,我习惯先理清主要原理步骤,不要一开始就被繁琐细节绊住,待具体实现时再逐个攻破.下面是主要步骤:      1.视频文件的读取:包括录制和本地文件读取       2.将需要转换的视频部分解析为 Bitmap 序列      3.将解析好的 Bitmap 序列编码生成 GIF 文件 二 视频文件的读取 视频文件的读取比较简单,没什么特别需要说的地方,这里简单贴出视频读取的核心部分代码,详细实现可以Go

Oracle SQL*Loader详解(3) 控制文件

控制文件是SQL*Loader里最重要的文件,它是一个文本文件,用来定义数据文件的位置.数据的格 式.以及配置数据加载过程的行为,在sqlldr中以control参数指定控制文件. 在控制文件里配置命令行参数 (OPTIONS) 在上一篇中我们讲过命令行参数可以配置在三个地方,其中一个就是可以使用控制文件的OPTIONS字 句(这也是最常用的方式),如下所示: OPTIONS (DIRECT=true, SILENT=(ERRORS, FEEDBACK) ) 更多的命令行参数,请见上一篇. 配置

详解C++编程中的文件流与字符串流_C 语言

C++文件流类与文件流对象 文件流是以外存文件为输入输出对象的数据流.输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据.每一个文件流都有一个内存缓冲区与之对应. 请区分文件流与文件的概念,不用误以为文件流是由若干个文件组成的流.文件流本身不是文件,而只是以文件为输入输出对象的流.若要对磁盘文件输入输出,就必须通过文件流来实现. 在C++的I/O类库中定义了几种文件类,专门用于对磁盘文件的输入输出操作. 除了标准输入输出流类istream.ostream和iostream

详解Android数据存储之SQLCipher数据库加密_Android

前言: 最近研究了Android Sqlite数据库以及ContentProvider程序间数据共享,我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录下,对于已经ROOT的手机来说的没有任何安全性可以,一旦被利用将会导致数据库数据的泄漏,所以我们该如何避免这种事情的发生呢?我们尝试这对数据库进行加密. 选择加密方案:  1.)第一种方案  我们可以对数据的数据库名,表名,列名就行md5,对存储的数据进行加密,例如进行aes加密(Android数据

详解MongoDB for C#基础入门_C#教程

笔者这里采用的是mongoDB官网推荐使用.net驱动: http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/ 有关于MongoDB的安装读者可以参考其他的博客,对于基本的学习来说并不需要进行过多的配置. 创建连接 这一步骤跟ADO.NET连接到数据库的步骤是一样的,ADO.NET是利用SqlConnection连接数据库,而MongoDB则使用MongoClient连接,并在构造函数中将连接字符

Oralce OMF功能详解(一) Oracle数据文件的OMF管理

OMF,全称是Oracle_Managed Files,即Oracle文件管理,使用OMF可以简化管理员的管理工作,不用指定文件的名字.大小.路径,其名字,大小,路径由oracle 自动分配.在删除不再使用的日志.数据.控制文件时,OMF也可以自动删除其对应的OS文件. OMF支持下列文件的自动管理: (1)表空间 (2)日志文件(联机) (3)控制文件 前提条件:需要为这些类型文件设定相关参数. 一.数据文件的OMF管理 数据文件管理参数:db_create_file_dest db_crea

详解PHP会话存储方式

先确认会话是否自动开启还是需要通过session_start()来手动开启: ; 指定会话模块是否在请求开始时自动启动一个会话.默认为 0(不启动) ; Initialize session on request startup. ; http://php.net/session.auto-start session.auto_start = 0 在客户端,会话可以存储在cookie或者通过URL参数来获取.依赖于服务器的配置: ; 指定是否在客户端用 cookie 来存放会话 ID.默认为 1