ASP緩衝技術詳解_應用技巧

來源:互聯網
上載者:User

一、何謂ASP緩衝/為什麼要緩衝
  當你的web網站採用asp技術建立的初期,可能感覺到的是 asp動態網頁技術帶來的便利性,以及隨意修改性、自如的http控制。但是,隨著訪問量的增加,你一定會發現自己的網站訪問速度越來越慢,IIS重新啟動得越來越頻繁。接下來,你一定想最佳化asp,諸如更換效能更優異的資料庫、建立索引、編寫預存程序等等。這些措施有些不需要增加成本壓力,有些則成本壓力很大(譬如叢access到SQL),而且效果還不一定。

  面對web訪問壓力,我認為最經濟的辦法是利用緩衝最佳化技術來實現緩解 web的服務壓力。
Web訪問量增加通常意味著以下資源需求的快速增長:

1、 網卡流量增加,需要消耗更多的CPU處理網路流量和網路I/O線程。
2、 需要更頻繁的開啟/關閉資料庫連結(如果使用資料庫技術—通常asp都會採用資料庫作為資料存放區),嚴重消耗資源的事物數量、以及事務相互競爭資源引起的死結、會增加網路I/O或者CPU消耗。
3、 如果採用session的話,IIS為了維持狀態,會消耗更多記憶體,而記憶體消耗可能會引發實體記憶體不夠,引起實體記憶體同輔存間的頻繁交換,從而引起代碼執行的停頓,web響應阻滯。
4、 由於訪問的不到及時響應,會引起網頁訪問故障,導致使用者重新整理,從而加劇CPU、記憶體等資源需求。

  實際上,考慮通常的web應用程式,很多時候的動態代碼執行是不必要的。

二、asp緩衝的分類

  擅自總結,asp的緩衝可以分為兩類:

  1、 檔案快取
  所謂檔案快取,就是根據邏輯判斷,一段時間內某個asp的特定執行將不會有很大的變動,因而將內容以靜態html的形式存放,然後以web的重新導向技術讓用戶端訪問靜態檔案,以達到減少CPU、資料庫資源等的需求。這樣的應用很多,譬如很多論壇就是在回複貼子的時候將整個貼子重建一個靜態檔案,然後進行重新導向的,例如 donews.com的論壇。該成靜態還有一個副作用(好處)–可以很容易被google等搜尋引擎收錄。一些所謂新聞發布系統的都採用了此技術。

  2、 檔案片斷緩衝

  所謂檔案快取,也是基於邏輯判斷,某部分資料(通常是需要消耗資源的大容量資料庫查詢取得)在一定時間內不會改變,所以我們可以將這些資料利用檔案的形式進行儲存,當需要時候,可以通過讀取檔案來擷取資料,避免增加資料庫的負擔。例如,我們通常將一些資料以xml格式儲存,然後利用xslt技術實現顯示(xml處理通常需要大量CPU資源,所以通常是IE直接讀取xml到用戶端在客戶的CPU上進行處理)。CSDN的論壇就是這樣處理的。

  3、 主存緩衝

  除此之外,還可以考慮在記憶體中處理緩衝,將需要及時響應的內容儲存在記憶體中,一旦訪問需求,立即從快速的貯存中輸送出去。如果極大量的訪問需求集中在幾個少量的頁面或者主存足夠多,我想採用主存緩衝一定可以大幅度提高web訪問效能。

三、如何?/使用緩衝

  實現緩衝需要考慮以下問題:

  1、 哪些頁面會在短時間內不會改變?
  分析自己的網站,這樣的頁面很多。譬如一個網站通常都有新聞資訊類的欄目,這些欄目通常都是網站維護人員在一天的某個時間發布資料,之後很少改動頁面。那麼這些頁面就適合於採用靜態檔案快取。實際上,所謂新聞發布系統就是這麼做的,那麼那也可以參考這些系統的思想改造自己的原有動態asp頁面。

  2、 那些頁面針對全部訪問者都採用同一個邏輯產生(也就是不區分訪問者)。
  除了新聞資訊之類的欄目所有訪問者都看一個介面外,論壇等消耗資源的應用一般也可以設計成統一邏輯產生(同一個貼子,張三李四看的都一樣),針對這類應用頁面我們也可以採用靜態緩衝來實現。也可以考慮將資料片斷化,利用指令碼技術在伺服器處理能力之外也就是用戶端瀏覽器進行處理。

  3、 採用緩衝的代價和收穫。
  主要就是“空間換(響應)時間”。利用緩衝技術將之後頻繁需要的內容進行預先處理,使之提高web伺服器響應能力,更重要贏得訪問者的歡心。
代價就是web空間需求增加,同時又可能影響到訪問效果。
但我認為適當的緩衝,是利大於弊的。

  4、 那些地方不適宜採用緩衝
  動態查詢頁面,每個人的查詢內容不一樣,所以顯示結果不大一樣,所以不大可能將查詢結果產生緩衝,所以採用緩衝較為複雜且緩衝利用率底下,造成管理成本上什(假設你緩衝了1000個查詢關鍵字,那麼管理這些關鍵字同緩衝的對應也是麻煩事)。

四、執行個體分析

  假設一個建議論壇的原有布局如下:

根目錄下:
default.asp 首頁,一般是精華、推薦之類
listBorad.asp 該檔案列出全部分欄目的名稱和介紹,如果攜帶參數MainBID就表示要列出板塊下的欄目
listThread.asp 該檔案如果不攜帶任何參數表示列出全部的貼子,攜帶MainBID表示列出某塊的全部貼子。如果攜帶subBID表示列出具體欄目的貼子。如果攜帶 page參數表示分頁列出主題。
ViewThread.asp 列出某個貼子內容。我們假設貼子顯示為一個發言,任意跟貼全部列在後面。ID參數為要顯示的貼子。
Reply.asp 回應某個貼子,攜帶參數Id回應某個貼子

  其它的暫不討論。

  以上,我們可以看到,如果全部是採用原始的 ASP/PHP來做,那幾乎每一個asp檔案的執行都需要資料庫操作,頻繁的查詢,多表查詢。要知道查詢資料庫最終會帶來效能的下降,響應速度下降,帶給訪問者緩慢的瀏覽影響,不利於web的品質。更重要的是對於甲乙兩個人來將,他們訪問ViewThread.asp之類的如果ID一致,那麼很多時候他們會看到同樣的內容(他們的瀏覽器收到的HTML代碼幾乎一樣),但是為了這“同樣的內容”,伺服器需要開啟資料庫連結、查詢,讀取紀錄,顯示,關閉紀錄、資料庫連結。。。。以下列的消耗伺服器資源的操作,如果是更多的人來訪問,最終的結果是這些人加劇消耗伺服器資源。實際上,這些為了“同樣的內容”所做的重複勞動是可以利用緩衝技術進行最佳化避免的。譬如:

  在reply.asp提交內容後,我們立即調用產生靜態功能,將整個貼子內容儲存為viewThread_xxxx.htm之類的靜態html檔案,再通常情況下訪問viewThread.asp?ID=xxxx的時候,系統自動 redirect到對應的靜態檔案viewThreadxxxx.htm去。這樣,當一個貼子沒有最新發行時候,他始終是靜態內容提供給瀏覽者;一旦有了新的提交,將會更新到靜態檔案中去,這樣,將會節省很多次資料庫操作,大大提高響應速度。

  listBorad.asp也可以實施靜態化。我們可以分析其可能攜帶的參數,將快取檔案名設定為listBoard_xx.htm,在增加新的欄目時候進行更新 listBoard_xxx.htm。listThread.asp也類似,只不過由於其參數更多,所以快取檔案也會很多。擊若要緩衝 listThread.asp? subBID=xxx&page=2,那麼對應的靜態檔案是listThread_xxx_p2.htm。default.asp也一樣。

  那麼如何判斷什麼時候更新?在什麼時機更新?
討論listThread.asp? subBID=xxx&page=2,我們在執行listThread.asp俄時候提取subID和page,然後探測 listThread_xxx_p2.htm是否存在,如果不存在就調用靜態產生功能進行產生該檔案,最終重新導向到此靜態檔案。注意,此處的不存在就意味著出現了新的內容需要我們進行更新。

  那如何造成檔案不存在呢?刪除。我們在發表一個新的貼子、刪除貼子、移動貼子的時候我們可以將類似listThread_xxx_p2.htm之類的靜態檔案全部刪除。這樣就通知了何時要進行緩衝。

  現在還剩下一個問題,如何產生靜態檔案?

  我們注意到,之前我們提到的“同樣的內容”。我們可以將改造前的default.asp、listThread.asp等拷貝一個副本,取名為default_d.asp、listThread_2.asp,且在同一個目錄中(理論上 listThtrad.asp?subID=123同LISTtHREAD_D.ASP?SUBID=123的訪問結果會是同樣的內容),這樣我們在需要產生靜態檔案的邏輯中,通過WEB訪問請求的方式調用改造前的副本,得到html代碼,並儲存為靜態檔案。這個web請求實際上相當於在任何真實瀏覽者訪問靜態內容之前,由伺服器自身現察看將會輸出的html,然後返回這些代碼,利用檔案操作功能儲存為靜態檔案。這樣,快取檔案就在真正瀏覽者之前被建立。

  這樣的方案幾乎不觸動原來的布局,幾乎不會造成因為改造出現404之類的錯誤。其次,靜態檔案也會協助你的網站容易被被google之類的搜尋引擎收錄。何樂而不為?

  最後,提醒,通過web訪問,asp編程環境下,很多人採用xmlHTTP組件訪問,這會造成很多問題。 xmlhttp自身會cache請求的資源,導致我們通過此組件請求得到的內容不是最新的,造成邏輯上的混亂。所以,應當選擇xml Server http對象或者winhttp組件來實現web請求資源。
使用ASP中的緩衝技術可以很大程度上提高你的網站效能,其實這些實現方法是非常的簡單,它將說明如何在伺服器上的緩衝是如何工作以及你如何使用一種被稱為中斷連線的ADO串連技術。

  在介紹這些技術之前先說明一下到底什麼是ASP的緩衝技術。

  所謂緩衝其實就是在記憶體中開闢一個用來儲存資料的空間,使用緩衝你就不用頻繁的訪問你儲存在硬碟上的資料了,靈活的使用緩衝你就免去了心疼的看著可憐的硬碟飽受讀資料時的折磨了。當你一旦執行了一個查詢動作,並且將查詢結果放入緩衝中後,你就可以很迅速的重複訪問這些資料了。而如果你不把資料放入緩衝的話,當你再次執行這個查詢時,伺服器會將進程耗費在從資料庫中擷取並排序上了。

  當資料儲存在緩衝中時,重新查詢時耗費的時間主要是在顯示資料的時間上了。
也就是說,我們不應該把經常需要改變的資料放到服務端的緩衝中,我們應該把改變少,但是又需要經常訪問的資料放到緩衝中。

  現在我們先討論ASP在服務端使用緩衝的技術,過會再討論ASP如何在用戶端使用
緩衝的技術。

  當你有大量的資料(靜態,就是說變動比較少的)需要顯示給用戶端時,你就可以考慮使用服務端的緩衝技術了。這種技術尤其適用於那些顯示風格一致性比較強的網站(呵呵,對於非主流的網站可不好用的說。)

  其實實現方法特別的簡單,大家只要看看下面這個簡單的例子就明白了。

  這是一個用來顯示書籍分類的例子程式

DisplayBooks.ASP檔案:

複製代碼 代碼如下:

< %@ LANGUAGE=JavaScript % >   
< html >   
< body >   
< form method=post >   
書籍分類; < %= getBooksListBox() % >   
< p>   
< input type=submit >   
 
< %   
function getBooksListBox()   
{   
BooksListBox = Application("BooksListBox")   
if (BooksListBox != null) return BooksListBox;   
crlf = String.fromCharCode(13, 10)   
BooksListBox = "< select name=Books>" + crlf;   
SQL = "Select * FROM Books orDER BY Name";   
cnnBooks = Server.CreateObject("ADODB.Connection");   
cnnBooks.Open("Books", "Admin","");   
rstBooks = cnnBooks.Execute(SQL);   
fldBookName = rstBooks("BookName");   
while (!rstBooks.EOF){   
BooksListBox = BooksListBox + " < option>" +   
fldBookName + "" + crlf;   
rstBooks.MoveNext();   
}   
BooksListBox = BooksListBox + ""   
Application("BooksListBox") = BooksListBox   
return BooksListBox;   
}   
% >

很簡單把,其實就是用了很簡單的Application技術,而且就一句話的不同:

複製代碼 代碼如下:

 Application("BooksListBox") = BooksListBox

你可以驗證一下你就會探索服務器上的請求數量會降低不少的。這種情況尤其適合與那些更新不是很頻繁的網站內容,例如你一天(或則很長時間)只更新一次。

  下面再討論一種用戶端的緩衝技術這種技術也叫中斷連線的ADO串連技術(翻譯水平太次,聽上去怎麼這麼彆扭)。這種技術主要使用在用來儲存使用者個人資訊,例如使用者的密碼,代號等等上面。它主要使用了ADO的一些屬性。同時也回答了一些網友曾經提到過的能否在Application中使用ADO對象的問題。解釋不清楚,下面讓代碼來發言:
檔案GLOBAL.ASA:

複製代碼 代碼如下:

<!--METADATA TYPE="TypeLib" FILE="C:\Program Files\Common  
Files\system\ado\msado15.dll"-- >   
< SCRIPT LANGUAGE=VBScript RUNAT="Server" >   
Sub Application_OnStart   
SQL = "Select UserName, Password FROM UserInfo"   
cnnUsers = "DSN=User"   
Set rsUsers = Server.CreateObject("ADODB.Recordset")   
'注意下面這兩句話,就是用來實現那個叫可用的中斷連線的ADO技術   
rsCustomers.CursorLocation = adUseClient   
rsCustomers.Open SQL, cnnAdvWorks, adOpenStatic, AdLockReadOnly   
' 斷開RecordSet的和資料庫的串連   
rsCustomers.ActiveConnection = Nothing   
Set Application("rsCustomers") = rsCustomers   
End Sub

檔案Users.ASP

複製代碼 代碼如下:

< %   
'Clone方法使得每個使用者擁有自己的一個RecordSet集合   
Set yourUsers = Application("rsUsers").Clone   
Set UserName = yourUsers("UserName")   
Set Password = yourUsers("Password")   
Do Until yourUsers.EOF   
% >   
 
使用者姓名:< %= UserName % > 使用者密碼:< %= Password % >
 
< %   
yourUsers.MoveNext   
Loop   
% >

於緩衝的作用,我想我也不用再多說了,它的作用已經很明顯,特別是對於資訊量非常大或是全資料庫頁面的網站,他能很好地利用主機的記憶體資源,加速ASP的執行效率,減輕伺服器的負擔,而動網在這一方面做得是最突出的,像他現在的dvbbs7.1.0版,更是在緩衝的利用上更上一層樓,前後台大多的操作都和緩衝有關,而現在動網裡用的也就是迷城浪子的緩衝類:

複製代碼 代碼如下:

< %   
Class Cls_Cache   
'==================使用說明====================   
'本類別模組是動網先鋒原創,作者:迷城浪子。如採用本類別模組,請不要去掉這個說明。
'公有變數:Reloadtime 到期時間(單位為分鐘)預設值為14400   
'MaxCount 緩衝對象的最大值,超過則自動刪除使用次數少的對象。預設值為300   
'CacheName 緩衝組的總名稱,預設值為"Dvbbs",如果一個網站中有超過一個緩衝組,則需要外部改變這個值。   
'屬性:Name 定義緩衝對象名稱,唯寫屬性。   
'屬性:value 讀取和寫入快取資料。   
'函數:ObjIsEmpty()判斷當前緩衝是否到期。   
' 方法:DelCahe(MyCaheName)手工刪除一個緩衝對象,參數是緩衝對象的名稱。   
'========================   
Public Reloadtime,MaxCount,CacheName   
Private LocalCacheName,CacheData,DelCount   
 
Private Sub Class_Initialize()   
Reloadtime=14400 '到期時間(單位為分鐘)   
CacheName="Dvbbs" '緩衝組的總名稱   
End Sub   
 
Private Sub SetCache(SetName,NewValue)   
Application.Lock   
Application(SetName) = NewValue   
Application.unLock   
End Sub   
 
Public Property Let Name(ByVal vNewValue) '緩衝對象名稱   
LocalCacheName=LCase(vNewValue)   
End Property   
 
Public Property Let Value(ByVal vNewValue) '讀取和寫入快取資料   
If LocalCacheName<>"" Then   
CacheData=Application(CacheName"_"&LocalCacheName)   
If IsArray(CacheData) Then   
CacheData(0)=vNewValue   
CacheData(1)=Now()   
Else   
ReDim CacheData(2)   
CacheData(0)=vNewValue   
CacheData(1)=Now()   
End If   
SetCache CacheName"_"&LocalCacheName,CacheData   
Else   
Err.Raise vbObjectError + 1, "DvbbsCacheServer", " please change the CacheName."   
End If   
End Property   
 
Public Property Get Value()   
If LocalCacheName<>"" Then   
CacheData=Application(CacheName"_"&LocalCacheName)   
If IsArray(CacheData) Then   
Value=CacheData(0)   
Else   
Err.Raise vbObjectError + 1, "DvbbsCacheServer", " The CacheData Is Empty."   
End If   
Else   
Err.Raise vbObjectError + 1, "DvbbsCacheServer", " please change the CacheName."   
End If   
End Property   
 
Public Function ObjIsEmpty() '判斷當前緩衝是否到期   
ObjIsEmpty=True   
CacheData=Application(CacheName"_"&LocalCacheName)   
If Not IsArray(CacheData) Then Exit Function   
If Not IsDate(CacheData(1)) Then Exit Function   
If DateDiff("s",CDate(CacheData(1)),Now()) < 60*Reloadtime Then ObjIsEmpty=False   
End Function   
 
Private Sub makeEmpty(SetName) '釋放記憶體   
Application.Lock   
Application(SetName) = Empty   
Application.unLock   
End Sub   
 
Public Sub DelCahe(MyCaheName) '刪除緩衝   
makeEmpty(CacheName"_"&MyCaheName)   
End Sub   
End Class   
 
'Set WydCache=New Cls_Cache   
'WydCache.Reloadtime=0.5 '定義到期時間 (以分鐘為單位)   
'WydCache.CacheName="pages" '定義緩衝名   
'IF WydCache.ObjIsEmpty() Then ''判斷是否可用(包括到期,與是否為空白值)   
'Response.write WydCache.Value   
'Else   
'..................   
'BoardJumpList=xxx   
'WydCache.Value=BoardJumpList '寫入內容   
'Response.write BoardJumpList   
'End if   
'   
'mycache.DelCahe(" 緩衝名") 刪除緩衝   
%>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.