欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP緩存技術(shù)詳解

 更新時間:2014年07月28日 13:18:32   投稿:junjie  
這篇文章主要介紹了ASP緩存技術(shù)詳解,本文詳細介紹了ASP緩存技術(shù)、ASP緩存的分類、ASP緩存的實現(xiàn)方法和使用方法等,需要的朋友可以參考下

一、何謂ASP緩存/為什么要緩存
  當(dāng)你的web站點采用asp技術(shù)建立的初期,可能感覺到的是 asp動態(tài)網(wǎng)頁技術(shù)帶來的便利性,以及隨意修改性、自如的http控制。但是,隨著訪問量的增加,你一定會發(fā)現(xiàn)自己的站點訪問速度越來越慢,IIS重新啟動得越來越頻繁。接下來,你一定想優(yōu)化asp,諸如更換性能更優(yōu)異的數(shù)據(jù)庫、建立索引、編寫存儲過程等等。這些措施有些不需要增加成本壓力,有些則成本壓力很大(譬如叢access到SQL),而且效果還不一定。

  面對web訪問壓力,我認為最經(jīng)濟的辦法是利用緩存優(yōu)化技術(shù)來實現(xiàn)緩解 web的服務(wù)壓力。
Web訪問量增加通常意味著以下資源需求的快速增長:

1、 網(wǎng)卡流量增加,需要消耗更多的CPU處理網(wǎng)絡(luò)流量和網(wǎng)絡(luò)I/O線程。
2、 需要更頻繁的打開/關(guān)閉數(shù)據(jù)庫連結(jié)(如果使用數(shù)據(jù)庫技術(shù)—通常asp都會采用數(shù)據(jù)庫作為數(shù)據(jù)存儲),嚴重消耗資源的事物數(shù)量、以及事務(wù)相互競爭資源引起的死鎖、會增加網(wǎng)絡(luò)I/O或者CPU消耗。
3、 如果采用session的話,IIS為了維持狀態(tài),會消耗更多內(nèi)存,而內(nèi)存消耗可能會引發(fā)物理內(nèi)存不夠,引起物理內(nèi)存同輔存間的頻繁交換,從而引起代碼執(zhí)行的停頓,web響應(yīng)阻滯。
4、 由于訪問的不到及時響應(yīng),會引起網(wǎng)頁訪問故障,導(dǎo)致用戶刷新,從而加劇CPU、內(nèi)存等資源需求。

  實際上,考慮通常的web應(yīng)用程序,很多時候的動態(tài)代碼執(zhí)行是不必要的。

二、asp緩存的分類

  擅自總結(jié),asp的緩存可以分為兩類:

  1、 文件緩存
  所謂文件緩存,就是根據(jù)邏輯判斷,一段時間內(nèi)某個asp的特定執(zhí)行將不會有很大的變動,因而將內(nèi)容以靜態(tài)html的形式存放,然后以web的重定向技術(shù)讓客戶端訪問靜態(tài)文件,以達到減少CPU、數(shù)據(jù)庫資源等的需求。這樣的應(yīng)用很多,譬如很多論壇就是在回復(fù)貼子的時候?qū)⒄麄€貼子重新生成一個靜態(tài)文件,然后進行重定向的,例如 donews.com的論壇。該成靜態(tài)還有一個副作用(好處)–可以很容易被google等搜索引擎收錄。一些所謂新聞發(fā)布系統(tǒng)的都采用了此技術(shù)。

  2、 文件片斷緩存

  所謂文件緩存,也是基于邏輯判斷,某部分數(shù)據(jù)(通常是需要消耗資源的大容量數(shù)據(jù)庫查詢?nèi)〉茫┰谝欢〞r間內(nèi)不會改變,所以我們可以將這些數(shù)據(jù)利用文件的形式進行存儲,當(dāng)需要時候,可以通過讀取文件來獲取數(shù)據(jù),避免增加數(shù)據(jù)庫的負擔(dān)。例如,我們通常將一些數(shù)據(jù)以xml格式存儲,然后利用xslt技術(shù)實現(xiàn)顯示(xml處理通常需要大量CPU資源,所以通常是IE直接讀取xml到客戶端在客戶的CPU上進行處理)。CSDN的論壇就是這樣處理的。

  3、 主存緩存

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

三、如何實現(xiàn)/使用緩存

  實現(xiàn)緩存需要考慮以下問題:

  1、 哪些頁面會在短時間內(nèi)不會改變?
  分析自己的站點,這樣的頁面很多。譬如一個站點通常都有新聞資訊類的欄目,這些欄目通常都是站點維護人員在一天的某個時間發(fā)布資料,之后很少改動頁面。那么這些頁面就適合于采用靜態(tài)文件緩存。實際上,所謂新聞發(fā)布系統(tǒng)就是這么做的,那么那也可以參考這些系統(tǒng)的思想改造自己的原有動態(tài)asp頁面。

  2、 那些頁面針對全部訪問者都采用同一個邏輯生成(也就是不區(qū)分訪問者)。
  除了新聞資訊之類的欄目所有訪問者都看一個界面外,論壇等消耗資源的應(yīng)用一般也可以設(shè)計成統(tǒng)一邏輯生成(同一個貼子,張三李四看的都一樣),針對這類應(yīng)用頁面我們也可以采用靜態(tài)緩存來實現(xiàn)。也可以考慮將數(shù)據(jù)片斷化,利用腳本技術(shù)在服務(wù)器處理能力之外也就是客戶端瀏覽器進行處理。

  3、 采用緩存的代價和收獲。
  主要就是“空間換(響應(yīng))時間”。利用緩存技術(shù)將之后頻繁需要的內(nèi)容進行預(yù)處理,使之提高web服務(wù)器響應(yīng)能力,更重要贏得訪問者的歡心。
代價就是web空間需求增加,同時又可能影響到訪問效果。
但我認為適當(dāng)?shù)木彺?,是利大于弊的?/p>

  4、 那些地方不適宜采用緩存
  動態(tài)查詢頁面,每個人的查詢內(nèi)容不一樣,所以顯示結(jié)果不大一樣,所以不大可能將查詢結(jié)果生成緩存,所以采用緩存較為復(fù)雜且緩存利用率底下,造成管理成本上什(假設(shè)你緩存了1000個查詢關(guān)鍵字,那么管理這些關(guān)鍵字同緩存的對應(yīng)也是麻煩事)。

四、實例分析

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

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

  其它的暫不討論。

  以上,我們可以看到,如果全部是采用原始的 ASP/PHP來做,那幾乎每一個asp文件的執(zhí)行都需要數(shù)據(jù)庫操作,頻繁的查詢,多表查詢。要知道查詢數(shù)據(jù)庫最終會帶來性能的下降,響應(yīng)速度下降,帶給訪問者緩慢的瀏覽影響,不利于web的質(zhì)量。更重要的是對于甲乙兩個人來將,他們訪問ViewThread.asp之類的如果ID一致,那么很多時候他們會看到同樣的內(nèi)容(他們的瀏覽器收到的HTML代碼幾乎一樣),但是為了這“同樣的內(nèi)容”,服務(wù)器需要打開數(shù)據(jù)庫連結(jié)、查詢,讀取紀(jì)錄,顯示,關(guān)閉紀(jì)錄、數(shù)據(jù)庫連結(jié)。。。。以下列的消耗服務(wù)器資源的操作,如果是更多的人來訪問,最終的結(jié)果是這些人加劇消耗服務(wù)器資源。實際上,這些為了“同樣的內(nèi)容”所做的重復(fù)勞動是可以利用緩存技術(shù)進行優(yōu)化避免的。譬如:

  在reply.asp提交內(nèi)容后,我們立即調(diào)用生成靜態(tài)的功能,將整個貼子內(nèi)容存儲為viewThread_xxxx.htm之類的靜態(tài)html文件,再通常情況下訪問viewThread.asp?ID=xxxx的時候,系統(tǒng)自動 redirect到對應(yīng)的靜態(tài)文件viewThreadxxxx.htm去。這樣,當(dāng)一個貼子沒有最新發(fā)布時候,他始終是靜態(tài)內(nèi)容提供給瀏覽者;一旦有了新的提交,將會更新到靜態(tài)文件中去,這樣,將會節(jié)省很多次數(shù)據(jù)庫操作,大大提高響應(yīng)速度。

  listBorad.asp也可以實施靜態(tài)化。我們可以分析其可能攜帶的參數(shù),將緩存文件名設(shè)定為listBoard_xx.htm,在增加新的欄目時候進行更新 listBoard_xxx.htm。listThread.asp也類似,只不過由于其參數(shù)更多,所以緩存文件也會很多。擊若要緩存 listThread.asp? subBID=xxx&page=2,那么對應(yīng)的靜態(tài)文件是listThread_xxx_p2.htm。default.asp也一樣。

  那么如何判斷什么時候更新?在什么時機更新?
討論listThread.asp? subBID=xxx&page=2,我們在執(zhí)行l(wèi)istThread.asp俄時候提取subID和page,然后探測 listThread_xxx_p2.htm是否存在,如果不存在就調(diào)用靜態(tài)生成功能進行生成該文件,最終重定向到此靜態(tài)文件。注意,此處的不存在就意味著出現(xiàn)了新的內(nèi)容需要我們進行更新。

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

  現(xiàn)在還剩下一個問題,如何生成靜態(tài)文件?

  我們注意到,之前我們提到的“同樣的內(nèi)容”。我們可以將改造前的default.asp、listThread.asp等拷貝一個副本,取名為default_d.asp、listThread_2.asp,且在同一個目錄中(理論上 listThtrad.asp?subID=123同LISTtHREAD_D.ASP?SUBID=123的訪問結(jié)果會是同樣的內(nèi)容),這樣我們在需要生成靜態(tài)文件的邏輯中,通過WEB訪問請求的方式調(diào)用改造前的副本,得到html代碼,并存儲為靜態(tài)文件。這個web請求實際上相當(dāng)于在任何真實瀏覽者訪問靜態(tài)內(nèi)容之前,由服務(wù)器自身現(xiàn)察看將會輸出的html,然后返回這些代碼,利用文件操作功能存儲為靜態(tài)文件。這樣,緩存文件就在真正瀏覽者之前被創(chuàng)建。

  這樣的方案幾乎不觸動原來的布局,幾乎不會造成因為改造出現(xiàn)404之類的錯誤。其次,靜態(tài)文件也會幫助你的站點容易被被google之類的搜索引擎收錄。何樂而不為?

  最后,提醒,通過web訪問,asp編程環(huán)境下,很多人采用xmlHTTP組件訪問,這會造成很多問題。 xmlhttp自身會cache請求的資源,導(dǎo)致我們通過此組件請求得到的內(nèi)容不是最新的,造成邏輯上的混亂。所以,應(yīng)當(dāng)選擇xml Server http對象或者winhttp組件來實現(xiàn)web請求資源。
使用ASP中的緩存技術(shù)可以很大程度上提高你的網(wǎng)站性能,其實這些實現(xiàn)方法是非常的簡單,它將說明如何在服務(wù)器上的緩存是如何工作以及你如何使用一種被稱為斷開連接的ADO連接技術(shù)。

  在介紹這些技術(shù)之前先說明一下到底什么是ASP的緩存技術(shù)。

  所謂緩存其實就是在內(nèi)存中開辟一個用來保存數(shù)據(jù)的空間,使用緩存你就不用頻繁的訪問你保存在硬盤上的數(shù)據(jù)了,靈活的使用緩存你就免去了心疼的看著可憐的硬盤飽受讀數(shù)據(jù)時的折磨了。當(dāng)你一旦執(zhí)行了一個查詢動作,并且將查詢結(jié)果放入緩存中后,你就可以很迅速的重復(fù)訪問這些數(shù)據(jù)了。而如果你不把數(shù)據(jù)放入緩存的話,當(dāng)你再次執(zhí)行這個查詢時,服務(wù)器會將進程耗費在從數(shù)據(jù)庫中獲取并排序上了。

  當(dāng)數(shù)據(jù)保存在緩存中時,再次查詢時耗費的時間主要是在顯示數(shù)據(jù)的時間上了。
也就是說,我們不應(yīng)該把經(jīng)常需要改變的數(shù)據(jù)放到服務(wù)端的緩存中,我們應(yīng)該把改變少,但是又需要經(jīng)常訪問的數(shù)據(jù)放到緩存中。

  現(xiàn)在我們先討論ASP在服務(wù)端使用緩存的技術(shù),過會再討論ASP如何在客戶端使用
緩存的技術(shù)。

  當(dāng)你有大量的數(shù)據(jù)(靜態(tài)的,就是說變動比較少的)需要顯示給客戶端時,你就可以考慮使用服務(wù)端的緩存技術(shù)了。這種技術(shù)尤其適用于那些顯示風(fēng)格一致性比較強的網(wǎng)站(呵呵,對于非主流的網(wǎng)站可不好用的說。)

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

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

DisplayBooks.ASP文件:

復(fù)制代碼 代碼如下:

< %@ 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技術(shù),而且就一句話的不同:

復(fù)制代碼 代碼如下:

 Application("BooksListBox") = BooksListBox

你可以驗證一下你就會發(fā)現(xiàn)服務(wù)器上的請求數(shù)量會降低不少的。這種情況尤其適合與那些更新不是很頻繁的網(wǎng)站內(nèi)容,例如你一天(或則很長時間)只更新一次。

  下面再討論一種客戶端的緩存技術(shù)這種技術(shù)也叫斷開連接的ADO連接技術(shù)(翻譯水平太次,聽上去怎么這么別扭)。這種技術(shù)主要使用在用來保存用戶個人信息,例如用戶的密碼,代號等等上面。它主要使用了ADO的一些屬性。同時也回答了一些網(wǎng)友曾經(jīng)提到過的能否在Application中使用ADO對象的問題。解釋不清楚,下面讓代碼來發(fā)言:
文件GLOBAL.ASA:

復(fù)制代碼 代碼如下:

<!--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")   
'注意下面這兩句話,就是用來實現(xiàn)那個叫可用的斷開連接的ADO技術(shù)   
rsCustomers.CursorLocation = adUseClient   
rsCustomers.Open SQL, cnnAdvWorks, adOpenStatic, AdLockReadOnly   
' 斷開RecordSet的和數(shù)據(jù)庫的連接   
rsCustomers.ActiveConnection = Nothing   
Set Application("rsCustomers") = rsCustomers   
End Sub

文件Users.ASP

復(fù)制代碼 代碼如下:

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

于緩存的作用,我想我也不用再多說了,它的作用已經(jīng)很明顯,特別是對于信息量非常大或是全數(shù)據(jù)庫頁面的網(wǎng)站,他能很好地利用主機的內(nèi)存資源,加速ASP的執(zhí)行效率,減輕服務(wù)器的負擔(dān),而動網(wǎng)在這一方面做得是最突出的,像他現(xiàn)在的dvbbs7.1.0版,更是在緩存的利用上更上一層樓,前后臺大多的操作都和緩存有關(guān),而現(xiàn)在動網(wǎng)里用的也就是迷城浪子的緩存類:

復(fù)制代碼 代碼如下:

< %   
Class Cls_Cache   
'==================使用說明====================   
'本類模塊是動網(wǎng)先鋒原創(chuàng),作者:迷城浪子。如采用本類模塊,請不要去掉這個說明。
'公有變量:Reloadtime 過期時間(單位為分鐘)缺省值為14400   
'MaxCount 緩存對象的最大值,超過則自動刪除使用次數(shù)少的對象。缺省值為300   
'CacheName 緩存組的總名稱,缺省值為"Dvbbs",如果一個站點中有超過一個緩存組,則需要外部改變這個值。   
'屬性:Name 定義緩存對象名稱,只寫屬性。   
'屬性:value 讀取和寫入緩存數(shù)據(jù)。   
'函數(shù):ObjIsEmpty()判斷當(dāng)前緩存是否過期。   
' 方法:DelCahe(MyCaheName)手工刪除一個緩存對象,參數(shù)是緩存對象的名稱。   
'========================   
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) '讀取和寫入緩存數(shù)據(jù)   
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() '判斷當(dāng)前緩存是否過期   
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) '釋放內(nèi)存   
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 '寫入內(nèi)容   
'Response.write BoardJumpList   
'End if   
'   
'mycache.DelCahe(" 緩存名") 刪除緩存   
%>

相關(guān)文章

最新評論