這次,我來談一點高深的話題:結構化存儲(Structured Storage).
也許有人要奇怪我為什麼研究到那個東西去了,不就是個打雜的麼?還要研究這些東西?我先說說來由。
我的網站上的地名信息系統一共包含70萬個文件,這麼多的文件處理起來是很成問題的,例如采用以下方法:
1.不在服務端任何緩存處理,直接在用戶訪問時返回頁面,這樣的話,缺點是反應速度慢,對Web服務器和數據庫服務器產生的壓力挺大,畢竟,與地圖相關的查詢通常是比較耗性能的(據我所知,一般的地圖公司的查詢引擎很少基於SQL)。
2.在服務端保存緩存文件,這樣的話數據庫的壓力小了,可是在頁面上緩存許多文件維護起來是很麻煩的事情(最麻煩的是通過FTP刪除了),而且,在文件夾下放太多的文件本身就會對系統的性能有挺大的影響。
基於以上的情況,我原來的Step1.cn處理方法是只對級別比較高的地名進行緩存,現在網站升級之後我有5G的空間可以用,因此我打算用第二套方法,可是沒有過多久,萬網居然通知我網站的文件數超出限制,我這才知道,在對文件大小的限制居然只有5萬個,如果我改回到Step1.cn的那種模式,這麼大的空間就完全浪費了,因此,我需要一種方法將這些文件合並起來。
在這裡,需要預先說明的是,這樣做應該是會耗損服務器的性能的,我也是抱著一個技術研究的想法去玩這個,目前還不敢部署上去,因為在網站服務器上使用這個可能會比較奇怪,對服務器的性能消耗有多大,我心裡也沒有底。
下面先說說結構化存儲,所謂的結構化存儲就是實現了一個簡單的文件系統的功能,可以向這個文件系統添加刪除文件或目錄,用起來和物理文件系統差別不大,主要區別是結構化存儲最終是將所有的文件存儲到一個大的文件裡面,這樣就可以實現我的需求。
關於結構化存儲,我雖然走通了其使用,可是我不是專家,如果要了解更多信息,建議參考如下文章並和博主聯系:
1.C# 中基於 COM+ 的結構化存儲(JianHua Zhang)
2.結構化存儲C#類庫(BlueDog)
我是直接使用了BlueDog的庫文件,在調用的時候,發現存在一個嚴重BUG,會造成文件句柄不能正常釋放的問題,該問題和解決方案我會在本文最後附上,目前正准備聯系BlueDog修正這個問題。
有了這個庫(需要說明的是,我以前其實打算直接用ZIP格式的,可是後來發現,ZIP文件一旦生成,不能修改,而且我覺得ZIP會附加一個壓縮和解壓過程,應該對性能的影響更大),下面要解決的問題就是網站上如何使用這個庫,當然不能在業務之中使用這個類,因為這樣架構是不合理的,似乎從.NET架構上來講,應該使用VirtualPathProvider Class (System.Web.Hosting)來實現的(例如寫一個類並繼承這個VirtualPathProvider,然後在Web.Config文件之中注冊,之後網站使用到System.IO.File的地方自動由自定義的類來處理,詳細情況可以參考ASP.Net 2.0 裡的VirtualPathProvider)可是我研究了決定不使用,因為相對比較麻煩,不夠靈活,而且我想把GZIP功能直接附加進去。