程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> Step1數據系統技術(5.使用GZIP技術優化文件緩存)

Step1數據系統技術(5.使用GZIP技術優化文件緩存)

編輯:關於ASP.NET

在上面的一篇,我們講到了服務器端的緩存,我的地名信息系統有70萬個頁面,生成該頁面的過程需要我從遠程的數據庫加載5個SQL數據返回的內容,還有RSS格式的新聞,因此生成一個頁面是很困難的,因此我使用了服務端緩存技術使性能獲得了大幅的提升,不過,又遇到了新的關於硬盤空間和流量的問題。

網站的70萬個地名當然不會一天之內都會被訪問,不過我的網站該欄目日訪問量大約為30000,考慮到重復的訪問,假設只訪問了10000個地名(實際上是不只的,因為地名的訪問很零散),那就是會有10000個緩存文件被生成,假設每個文件只有10K(實際上也不只這麼大),合起來第一天就會產生100M的緩存(實際上我的網站第一天就有300M),之後每天還是以50M的速度增加,而我的網站空間一共只有600M,我有一次10天沒有關注網站,結果因為硬盤空間站用到達2G而被萬網關閉了。

還有就是隨著訪問量的增大,網站流量也很大,一個月第8天就將萬網限制的50G流量用到了20G,而網站訪問量還在上漲。

在這個時候,我想到了GZIP。

GZIP是一個將壓縮技術使用到HTTP上的技術,說起來很簡單,就是讓服務器將文件內容壓縮並發給浏覽器,浏覽器接受之後先解壓再用來解析,在這種情況下,節省網絡流量開支,浏覽器傳送的文本是很多的,而文本壓縮通常都可以到原來文件的20%,而且GZIP技術目前主流的浏覽器都是支持的,這是一個通過消耗服務器性能來節省流量的模式。

不過在我的使用之中,並沒有消耗服務器性能,而直接節省流量,因為我在使用的時候,文件在緩存的時候就直接使用GZIP格式來存放了,因此在客戶端請求該文件的時候,我不需要先壓縮再傳送,而是直接傳送,相對來講,甚至還提高了服務器的性能。

我使用的時候,在緩存文件生成的時候,將文本直接壓縮為GZIP格式來保存,這樣的話,我的緩存文件大小由原來的15K左右變為2-3K,大大的節省了網站的空間,當用戶訪問該文件的時候,我進行判斷,如果浏覽器是支持GZIP的,我就直接將緩存文件的字節流返回到浏覽器,如果浏覽器不支持(這種可能性相當低),我反而需要將該文件解壓,將解壓後的字節流返回到客戶端。

以上可以看出,我確實節省了網站的空間和流量,而且因為現在的浏覽器95%以上(保守估計,因為我沒有聽說哪個不支持)都是支持GZIP的,實際上網站的服務端性能反而有提升,這叫有百利而五一害。

如何判斷浏覽器是否支持GZIP呢?浏覽器在發送HTTP請求的時候,會有一個HEAD字段叫Accept-Encoding,代表浏覽器支持的返回編碼格式,通常為以下值(deflate代表明文):

Accept-Encoding: gzip, deflate

浏覽器又如何判斷服務端返回的數據是明文還是GZIP格式的呢?也是通過服務端的HEAD字段,例如:

Content-Encoding: gzip

如果該值不是GZIP,則代表為明文,而且,該字段同時也可能代表文本文件的編碼,例如utf-8

以下是我具體使用GZIP的做法,首先是緩存的寫入過程:

FileStream fileStream=File.Create(path);//創建緩存文件
Stream writer=new GZipOutputStream(fileStream);//將緩存文件流使用GZIP來寫入
XsltArgumentList list=new XsltArgumentList();//我的網站是使用XML+XSLT來生成頁面的
xslt.Transform(xml,list,writer,null);//將XSLT生成的內容傳遞到GZIP壓縮程序
writer.Close();//完成寫入
fileStream.Close();//關閉文件句秉

其次是讀取緩存的過程:

if(acceptEncoding!=null && acceptEncoding.IndexOf("gzip")>=0)//通過請求的http head來判斷是否支持GZIP
{//如果支持GZIP,返回gzip格式
 Response.AddHeader("Content-Encoding","gzip");//通知浏覽器該文件是GZIP壓縮過的文件
 Response.TransmitFile(path);//直接將該文件返回
}
else
{//返回明文格式,這種情況下我們要從ZIP文件之中解壓縮出文件內容,不需要發送Content-Encoding Head,因為默認就是明文的
 Stream reader=new GZipInputStream(File.OpenRead(path));//打開該文件
 byte[] buffer=new byte[1024];//建立文件讀取緩存
 int p;
 while((p=reader.Read(buffer,0,1024))>0)//每次讀取到相應的緩存就返回內容
 {
  Response.OutputStream.Write(buffer,0,p);
  Response.Flush();
 }
}

以上就是我的實現全過程,因為我是使用XML+XSLT來實現頁面的,因此使用該技術的時候顯得很順暢,而對於通過頁面ASPX,JSP等技術來返回的用戶可能就有一些麻煩了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved