.NET緩衝初探

來源:互聯網
上載者:User

一、緩衝概述


緩衝是一項在電腦中廣泛用來提高效能的技術,它將訪問頻率高或構造成本高的資料保留在記憶體中,在緩衝有效期內對該資料的訪問可以直接從記憶體中讀取,而不必重複執行,這樣既節省了系統資源,又
加快了程式運行速度。對於Web Form來說,緩衝技術極其重要,因為通過Internet傳輸資料的速度可能非常緩慢。通過快取資料,Web Form可以極大地提高應用程式的響應速度和效能,從而改善傳輸效能。

在Web Form中,緩衝用於保留在HTTP請求時的頁面或資料,並在無需重新建立的情況下重新使用它們。.NET中有三種可由Web Form使用的緩衝:

·網頁輸出快取 它緩衝請求的整個頁面。

·頁面片斷緩衝 它緩衝請求頁面中的自定義使用者控制項。

·頁面資料緩衝 它以編程方式快取頁面面中的對象或資料。

我們應該如何區別使用這三種緩衝呢?下文我們將以執行個體來分別討論它們的使用方法。

二、緩衝的使用

1、網頁輸出快取的使用

顧名思義,頁面輸出緩存就是指將整個頁緩衝起來,以後對該頁的請求將由緩衝輸出,而不必執行建立該頁的代碼。網頁輸出快取是ASP.NET中最常用的一種緩衝技術。在訪問量很大的網站中,對訪問頻率高的頁即使一次僅緩衝一分鐘,也會帶來巨大的輸送量收益。

啟動網頁輸出快取功能很簡單,只需使用頁面編譯指令OutputCache即可:

<% @ OutputCache Duration=”Time” VaryByParam=”none” %>

該指令中,OutputCache指示將頁放入緩衝,參數Duration設定以秒為單位的緩衝有效期間,VaryByParam設定緩衝隨查詢字串中的成對的名稱和數值值變化的請求。具體應用請看例1,VaryByParam的應用請看例2。

例1:PageCache.aspx

<%@ OutputCache Duration="30" VaryByParam="none" %>

<%@ Page Language="VB" %>

<HTML>

<HEAD>

<title>頁面輸出緩衝技術</title>

<script runat="server">

Sub Page_Load(obj as object,e as eventargs)

‘輸出頁面產生時間

lblMessage.text = "歡迎您!現在時間是:" & datetime.now.tostring()

End Sub

</script>

</HEAD>

<body>

<form id="Form1" method="post" runat="server">

<div align="center">

<font style="font-size:12pt;font-weight:bolder;color:red">網頁輸出快取技術</font>

<hr size=1>

<asp:Label id="lblMessage" runat="server" />

</div>

</form>

</body>

</HTML>

這是一個簡單的使用頁面輸出緩衝的例子,它的運行結果是在螢幕上顯示頁的產生時間。編譯指令OutputCache指示頁被緩衝30秒,VaryByParam的值為none表示該頁不隨任何 GET 或 POST 參數改變。在緩衝有效期內對該頁的請求由緩存服務,30 秒後從緩衝中移除該頁,將顯式處理下一個請求並再次快取頁面。就本例而言,在緩衝30秒內無論如何重新整理,當前時間都不會改變,這充分說明在緩衝期內頁並沒有真正執行,它只是直接將快取頁面讀取出來以響應用戶端的請求。只有當緩衝到期後再次請求時頁才會重新被執行並產生新的目前時間。

那麼在網頁輸出快取中,參數VaryByParam應該如何使用呢?在開發ASP.NET應用程式時,我們經常要進行參數傳遞,並用此參數進行條件查詢。參數一般可以通過檔案名稱來傳遞,如PageParamCache.aspx?name=jack 表示傳遞了值為“jack”的參數name。那麼,如何根據參數值來對整個頁進行緩衝呢?這裡就要用到參數VaryByParam了。ASP.NET會根據傳遞的參數值來判斷被請求頁是否在緩存中,如果參數值不同,ASP.NET會注冊一個緩衝遺漏(Cache Miss),即沒有在緩衝中找到頁,然後重新執行該頁,並將其存儲到緩衝中。如果參數相同,ASP.NET將直接從緩衝中讀取輸出。這就意味著同一個頁可以根據不同的參數/值產生不同的快取頁面。具體應用我們來看例2。

例2:PageParamCache.aspx

<%@ OutputCache Duration="60" VaryByParam="name" %>

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.SqlClient" %>

<html>

<script language="VB" runat="server">

Sub Page_Load(Src As Object, E As EventArgs)

Dim MyConnection As SqlConnection

Dim MyCommand As SqlDataAdapter

Dim ds As DataSet

Dim strName As String

Dim strSQL As String

queryState = Request.QueryString("name")

If queryState = Nothing

‘未用參數查詢

strSQL = "select * from articles"

Else

‘帶參數查詢

strSQL = "select * from articles where name = '" & strNmae & "'"

End If

MyConnection = New SqlConnection("server=Localhost;uid=sa;pwd=;database=article")

MyCommand = New SqlDataAdapter(strSQL, MyConnection)

ds = New DataSet()

MyCommand.Fill(ds, "articles")

dbgridContent.DataSource=new DataView(ds.Tables(“articles”))

dbgridContent.DataBind()

lblMessage.Text = DateTime.Now.ToString()

End Sub

</script>

<body>

<div align=”center”>

<font style=”font-size:12pt;font-weight:bolder;color:red”>使用帶參數的頁面輸出緩衝</font>

<br>按作者分類:<br>

<table cellspacing="0" cellpadding="3" width=700>

<tr>

<td><a href="PageParamCache.aspx?name=張三">張三</a></td>

<td><a href="PageParamCache.aspx?name=李四">李四</a></td>

<td><a href="PageParamCache.aspx?name=王五">王五</a></td>

<td><a href="PageParamCache.aspx?name=錢六">錢六</a></td>

<td><a href="PageParamCache.aspx?name=劉七">劉七</a></td>

</tr>

</table>

<ASP:DataGrid id="dbgridContent" runat="server" /><br>

<i>上次產生時間:</i> <asp:label id="lblMessage" runat="server"/>

</div>

</body>

</html>

例2中,我們指定參數VaryByParam的值是name,作用是指示頁根據name值進行緩衝處理。當您第一次單擊給定姓名的連結時,頁面底部會產生一個新的時間戳記。此後,只要在一分鐘內重新提交對該姓名的請求時,都會得到原來的時間戳記,表示該請求已被緩衝。當您單擊其他姓名的連結時,系統首先會尋找以該姓名值存儲的快取頁面,如果未找到,則重新執行頁,並進行緩衝,如果找到,則直接輸出快取頁面。在例2所給的情況下,PageParamCache.aspx最多可以有5個不同的頁面輸出緩衝以響應5個帶有不同參數值的連結請求。

如果傳遞的參數不止一個,那麼即使字串參數與值都相同,但排列次序不同,那麼在請求頁面時,也將產生不同的快取頁面。例如PageParamCache?first=chris&last=payne 和PageParamCache? last=payne&first=chris雖然參數完全相同,但由於排列次序不同,將產生兩個不同的緩存頁。具體應用大家可以自己實驗一下,本文不再贅述。

2、頁面片斷緩衝的使用

有時緩衝整頁是不可行的——可能必須針對每個請求來建立或自訂該頁的各部分。在這種情況下,標識那些構造成本高並且適於緩衝的對象或資料通常是值得的。標識了這些項後,可建立它們一次然後將它們緩衝一段時間。此外,片斷緩衝還可用於快取頁面輸出的各地區。在ASP. NET中,頁面片斷緩存一般用來存放自訂使用者控制項。

例如,某一頁面既要從資料庫中讀取最近10條新聞綁定到DataGrid,同時還要將頁面訪問量計入資料庫。很顯然,讀取新聞綁定DataGrid的操作應該放入緩衝,因為新聞更新不會很頻繁,這樣可以避免頻繁地存取資料庫。但統計頁面訪問量操作卻不能放入緩衝,否則在緩衝有效期內的頁面請求將被忽略。解決這一對“矛盾”最好的辦法就是使用頁面片斷緩衝。在例3中,我們把SQL 查詢和綁定DataGrid的操作定義為用戶控制項(LastedNews.ascx),並將它放入緩衝,而父頁面(ControlParentcache.aspx)不進行緩衝處理以得到真實的訪問量統計資料。

例3:父頁面ControlParentCache.aspx

<%@ register TagPreFix="zhao" TagName="LastedNews" src="LastedNews.ascx" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<title>頁面片斷緩衝</title>

<script runat="server">

'統計頁面訪問次數並存入資料庫visitor表

Sub Page_Load(obj as object,e as eventargs)

Dim myConnection As New SqlConnection("server=LocalHost;uid=sa;pwd=;database=news")

myConnection.Open()

dim myCommand as new sqlCommand

Dim myDataReader As SqlDataReader = myCommand.ExecuteReader()

Dim intVisit As Integer = myDataReader.Item("visittimes") + 1

myConnection.Close()

myCommand = New SqlCommand("update visitor set visittimes=" & intVisit , myConnection)

myCommand = Nothing:myDataReader = Nothing:myConnection = Nothing

End Sub

</script>

</HEAD>

<body>

<form id="Form1" method="post" runat="server">

<div align="center">

<font style="FONT-WEIGHT:bolder;FONT-SIZE:12pt;COLOR:red">最近十條新聞</font>

<hr size="1">

<zhao:LastedNews runat="server" id="defaultNewsStock" />

</div>

</form>

</body>

</HTML>

例3:使用者控制項LastNews.ascx

<%@ OutputCache Duration="60" VaryByParam="*" %>

<script runat="server">

‘產生DataGrid

Sub Page_Load(obj as object ,e as EventArgs)

‘將DataView記錄集綁定到DataGrid

dbgridLastedNews.DataSource = LoadDataView()

dbgridLastedNews.DataBind()

End Sub

Function LoadDataView() As DataView

‘定義串連並開啟串連

Dim myConnection As New SqlConnection("server=LocalHost;uid=sa;pwd=;database=news")

myConnection.open()

‘執行查詢操作,並將結果記錄集填充到DataView中

Dim myCommand As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter("select top 10 * from news order by id desc", myConnection)

myCommand.Fill(ds, "news")

LoadDataView = New DataView(ds.Tables("news"))

myCommand.Dispose()

End Function

</script>

<asp:DataGrid id="dbgridLastedNews" runat="server"></asp:DataGrid>

在例3中,由於我們把統計訪問量的代碼放在父頁的頁面載入函數Page_Load()裡,所以我們不能對父頁進行緩衝處理。在用戶控制項的定義檔案LastedNews.ascx中,我們則清楚地看到對它進行了緩衝處理,有效期間為60秒。這樣無論何時載入父頁,Page_Load()函數總是能夠得以執行,而綁定DataGrid的使用者控制項在緩衝有效期間內可以直接從緩衝讀出。利用頁面片斷緩衝,我們在保持了父頁的動態屬性的同時,又可以對使用者控件進行緩衝處理,可謂實現了“雙贏”。

3、頁面資料緩衝的使用

通俗地說,頁面資料緩存就是將對象加入到緩存中。我們可以回想一下建立DataGrid對象的過程:建立sqlConnectionà開啟sqlConnectionà創建sqlDataAdapterà帶SQL參數運行sqlDataAdapterà填充DataSetà綁定到DataGrid,細數一下建立一個DataGrid至少需要六個步驟,這不僅降低了程式執行速度,也消耗了無須消耗的系統資源。如果在完成這些操作後,將結果(如DataSet)緩衝起來有多好!事實上,頁面資料緩衝最常見的用途就是快取資料庫返回的結果,使它在緩衝期內輸出時能夠很方便快捷地綁定到DataGrid。

我們先來看看例4。例4是一個使用cache類來緩衝從資料庫返回的資料的例子。

例4:ObjectCache.aspx

<%@page Language=”VB” %>

<@Import Namespace=”System.Data” %>

<@Import Namespace=”System.Data.sqlclient” %>

<script runat=”Server”>

Sub Page_Load(obj as object,e as EventArgs)

If ont Page.IsPostBack then

CreateData()

End If

End Sub

Sub CreateData

Dim source as DataView

把緩衝中的DataView賦值給source

Source = cache(“DataView”)

如果緩衝是空的(即第一次執行或緩衝到期)

If source is nothing then

‘建立並開啟串連

Dim myConnection As SqlConnection

myConnection = new sqlConnection("server=LocalHost;uid=sa;pwd=;database=news")

myConnection.open()

dim myCommand as sqlDataAdapter

myCommand = New SqlClient.SqlDataAdapter("select * from news order by id desc", myConnection)

myCommand.Fill(ds, "news")

source= New DataView(ds.Tables("news"))

cache(“DataView”) = source

‘給出DataGrid產生方式資訊

lblMessage.text = “顯式建立的資料集”

else

lblMessage.text = “從緩衝中檢索到的數據集”

End If

dbgridNews.DataSource = source

dbgridNews.DataBind()

End Sub

<html><body>

<form runat=”Server” id=”form1”>

<asp:DataGrid id=”dbgridNews” runat=”Server” />

<hr size=1>

<asp:Label id=”lblMessage” runat=”server” />

</form>

</body></html>

當例4被首次載入時,頁面將從資料庫中取回資料填充到DataSet中,將其綁定到DataGrid,同時將它儲存到緩衝中。以後資料緩衝期內的頁面請求,就可以從緩衝中得到資料,執行速度自然會大大提高。

與前面兩種緩衝技術相比,頁面資料緩衝具有三大優點:首先,它可以緩衝任何對象,您無需緩衝整個頁或使用者控件,而可以更細緻地進行緩衝。其次,Cache類允許您使用動態的失效期(sliding expiration)。最後,可以為放置在Cache類中的對象設定依存關係(dependencies)。這意味著您可以將被緩衝的資料設定為依賴於另一項內容。緩衝的DataGrid可以依賴於底層的資料。當來源資料發生變化時,緩衝的DataGrid將被作廢,並重新創建一個新的DataGrid。

三、如何高效地使用緩存技術

緩衝技術可以極大地提高Web Form的效能。在負載很大的情況下,即使緩衝時間非常短,其效果也十分明顯。通常,有很多資訊可以進行緩存,包括從資料庫或文件中取回的資料、複雜電腦的結果以及應用程式的設定等。

雖然本文論述了使用緩存所帶來的若干好處,但並不是任何時候任何情況都適合使用緩衝,如必須提供最新股票報價的頁面。除非設定足夠的依存關係,否則在這種情況下使用緩衝將是非常糟糕的,因為如果設定了緩衝,那麼訪問者在頁面緩衝的時間裡將無法及時得到最新的股票資料。

下面的表格中列出了常見的應該和不應該使用緩衝的情況。

應 該 不 應 該
應該緩衝那些經常被訪問、同時變化頻率不大的資料
應該緩衝整個應用程式都要使用的設定或對象,但這些設定和對象必須在其生存期內不會變化不要緩衝個人資訊。如果緩衝個人資訊,其他人很容易取得這些信息。
不要緩衝包含基於時間值的頁面,否則瀏覽者將無法理解為何時間總是滯後。
不要緩衝使用者隨時都會修改的對象,如購物車。

最後需要強調說明的是,在Web Form調試期間不能使用緩衝,否則你對頁面所做的修改在緩衝過期之前不會得到顯式加載。正確的做法應該是在調試結束之後,給需要放入緩衝的頁面、用戶控制項或對象加上緩衝指令。最後建立部署和安裝項目,產生安裝數據包,這時候就可以到伺服器上去發布你的產品了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.