成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解MongoDB實現存儲物理文件和SQUID加速

數據庫 其他數據庫 MongoDB
今天我們要講到的是在MongoDB上如何存儲物理文件,以及實現SQUID加速等問題。希望對大家了解“芒果”有所幫助。

之前在閱讀MongoDB GFS文檔時,學習了它如何存儲物理文件(包括大文件)的方式。為了加深印象,專門寫了一個上傳文件存儲到Mongodb的示例。當然后因為是存儲到文檔數據庫中,所以就不能用普通方式來訪問這些物理文件了,這里又專門寫了一個aspx頁面專門讀取這些文件(比如圖片或MP3等),所以下載示例之后會看到兩個頁面,一個是uploadfile.aspx(上傳),一個是getfile.aspx(從mongodb中把文件以流的方式讀出來)。當然考慮到訪問速度,這里還引入了SQUID來進行文件加速(當前SQUID默認只緩存靜態文件,所以這里要對ASPX頁面的輸出進行一下設置,這些都會在本文中進行介紹)

首先介紹一下開發環境,我使用的是VS2008+SP1 ,mongodb客戶端軟件用的是samus-mongodb(最新版本即可)

添加對下面名空間的引用

  1. using MongoDB;  
  2. using MongoDB.GridFS; 

下面是上傳文件的主要代碼:

uploadfile.aspx.cs    

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

這里只是給上傳文件起個隨機名稱,這樣如果一切正常,就可以在數據庫中找到該文件了,如下圖:

    

下面看一下如何訪問上傳的物理文件getfile.aspx.cs(通過傳遞filename參數,mongodb中相應字段結構,如上圖):

  1. protected void Page_Load(object sender, EventArgs e)  
  2.      {  
  3.          if (!string.IsNullOrEmpty(Request.QueryString["filename"]))  
  4.          {  
  5.              string filename = Request.QueryString["filename"];  
  6.              Init();  
  7.              String filesystem = "gfstream";  
  8.  
  9.              GridFile fs = new GridFile(DB, filesystem);  
  10.              GridFileStream gfs = fs.OpenRead(filename);  
  11.  
  12.              Byte[] buffer = new Byte[gfs.Length];  
  13. HttpContext.Current.Response.AddHeader("Expires", DateTime.Now.AddDays(20).ToString("r"));  
  14.              HttpContext.Current.Response.AddHeader("Cache-Control""public");  
  15.         
  16.              // 需要讀的數據長度  
  17.              long dataToRead = gfs.Length;  
  18.              int length;  
  19.              while (dataToRead > 0)  
  20.              {  
  21.                  // 檢查客戶端是否還處于連接狀態  
  22.                  if (HttpContext.Current.Response.IsClientConnected)  
  23.                  {  
  24.                      length = gfs.Read(buffer, 0, 10000);  
  25.           HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);  
  26.                      HttpContext.Current.Response.Flush();  
  27.                      buffer = new Byte[10000];  
  28.                      dataToRead = dataToRead - length;  
  29.                  }  
  30.                  else 
  31.                  {  
  32.                      // 如果不再連接則跳出死循環  
  33.                      dataToRead = -1;  
  34.                  }  
  35.              }  
  36.              gfs.Dispose();  
  37.              HttpContext.Current.Response.End();  
  38.          }  
  39.      } 

下面就是以列表的方式從mongodb中檢索文件列表的最終的運行效果:

    

盡管MONGODB的并發性能很不錯,但每次都去mongodb取的話也是有性能損耗的,特別是對于不經常變化的物理文件,所以這里使用了SQUID來進行文件緩存。當前SQUID默認只支持靜態文件,對于本示例中的ASPX頁面輸出的流信息來緩存還要進行一下設置。    

首先,如果在squid.conf文件中有如下行,需要用#進行注釋(它會禁止緩存所有帶?的鏈接地址):

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

這樣,再修改一下相應的.aspx,并在Header中添加如下信息,即:    

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

這樣SQUID就會忠實在根據該頭信息來CACHED相應文件了。

當然也可以用如下方式來讓指定那些文件aspx文件才會被SQUID CACHED:   

  1. acl CACHABLE_PAGES urlpath_regex \getfile.aspx  
  2.    #允許cache上面的aspx頁面  
  3.    no_cache allow CACHABLE_PAGES 

而下面一個acl匹配所有的動態頁面并禁止緩存所有aspx頁面

  1. #acl NONE_CACHABLE_PAGES urlpath_regex \? \.aspx     
  2.     #禁止cache其它的aspx頁面  
  3.     #no_cache deny NONE_CACHABLE_PAGES 

下面幾行設置頁面cache的時長,第一行cache一天,第二行cache兩分鐘

  1. refresh_pattern ^http://10.0.4.114:1100/mongodbsample/getfile.aspx 1440 0% 1440 ignore-reload  
  2. 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

原文標題:使用Mongodb存儲上傳物理文件并進行SQUID加速(基于aspx頁面)

鏈接:http://www.cnblogs.com/daizhj/archive/2010/08/19/1803454.html

【編輯推薦】

  1. MongoDB CEO談NoSQL的大數據量處理能力
  2. 拋棄關系數據庫 PHP程序員應了解MongoDB的五件事
  3. MongoDB,無模式文檔型數據庫簡介
  4. 關系數據庫的末日是否已經來臨
  5. 扔掉沉沒成本 嘗試關系數據庫替代品OODBMS 
     
責任編輯:彭凡 來源: 博客園
相關推薦

2018-07-17 14:50:47

存儲虛擬化技術

2013-11-11 10:22:14

存儲虛擬化

2013-07-24 18:06:07

存儲存儲虛擬化

2010-05-10 14:16:50

Oracle樹結構

2023-04-14 15:37:02

DataLeap存儲優化MySQL

2010-09-09 08:42:28

MongoDB

2009-06-19 17:39:52

ibmdwLotus

2009-07-31 17:01:00

ibmdwAmazon

2025-05-16 08:58:47

Mongodb分布式存儲

2023-12-01 16:30:12

2018-08-17 10:05:25

存儲系統轉型

2018-06-14 08:44:03

2017-04-26 08:51:36

MongoDB集群實戰

2011-08-03 13:28:08

Oracle數據庫數據庫控制文件

2022-02-17 08:02:45

對象存儲RGW

2010-05-05 14:14:56

iMC數據中心管理平臺

2017-09-15 16:00:48

Lucene存儲讀取技術

2010-11-15 11:58:02

Oracle物理結構

2019-08-06 09:11:49

數據庫數據結構操作系統

2017-07-13 09:48:17

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色天天综合 | 日韩在线观看网站 | 蜜桃视频在线观看免费视频网站www | а_天堂中文最新版地址 | 午夜资源 | 国产午夜精品福利 | 国产精品免费一区二区 | 亚洲成人免费视频在线 | 99riav国产一区二区三区 | 99国产视频 | 91视频久久 | 中文字幕一区二区三区四区五区 | 免费观看一级毛片 | 精品久久久久久久久久久久 | 欧美日韩高清一区 | 在线欧美一区 | 亚洲欧美在线视频 | 干出白浆视频 | 91视频三区 | 国产在线精品一区二区三区 | 欧美极品在线播放 | 日韩欧美亚洲综合 | 中文字幕一区二区三区在线观看 | 亚洲欧美在线观看 | 一区二区三区久久久 | 男人天堂视频在线观看 | 欧美男人亚洲天堂 | 日韩a在线 | 成人午夜在线 | 中文字幕国产视频 | 欧美在线天堂 | 亚洲欧美在线观看 | 范冰冰一级做a爰片久久毛片 | 久久久久久亚洲精品 | 18gay男同69亚洲网站 | 久久久国产精品一区 | 国产9久| 亚洲劲爆av| 日日干天天操 | 国产一区二区视频免费在线观看 | 91精品国产乱码久久久 |