ASP.NET緩存

什麼是緩存?緩存技術是將經常使用的數據/信息存儲在內存中的技術,以便下次需要相同的數據/信息時,可以直接從內存中檢索,而不是由應用程序生成。

緩存對於提高ASP.NET性能非常重要,因爲頁面和控件是在這裏動態生成的。這對於數據相關的事務尤其重要,因爲這些事務在響應時間上是昂貴的。

高速緩存將常用數據放置在快速訪問的媒體中,例如計算機的隨機存取存儲器。 ASP.NET運行時包含稱爲緩存的CLR對象的鍵值映射。 這駐留在應用程序中,可通過HttpContextSystem.Web.UI.Page獲取。

在某些方面,緩存類似於存儲狀態對象。 然而,在狀態對象中存儲信息是確定性的,即可以指望存儲在那裏的數據,並且數據的緩存是非確定性的。

在以下情況下數據將不可用:

  • 如果緩存使用期限過期,
  • 如果應用程序釋放內存,
  • 如果由於某種原因緩存不起作用。

可以使用索引器訪問緩存中的項目,並可以控制緩存中對象的生存期並設置緩存對象與其物理源之間的鏈接。

ASP.Net緩存

ASP.NET提供了以下不同類型的緩存:

  • 輸出緩存 - 輸出緩存存儲最終呈現的HTML頁面的副本或發送到客戶端的部分頁面。 當下一個客戶請求這個頁面時,不用重新生成頁面,而是發送頁面的緩存副本,從而節省時間。

  • 數據緩存 - 數據緩存意味着緩存來自數據源的數據。只要緩存未過期,就會從緩存中滿足對數據的請求。 當緩存過期時,數據源獲取新的數據,並重新填充緩存。

  • 對象緩存 - 對象緩存緩存頁面上的對象,如數據綁定控件。 緩存的數據存儲在服務器內存中。

  • 類緩存 - Web頁面或Web服務在第一次運行時會彙編到程序集中的頁面類中。然後程序集被緩存在服務器中。下一次請求頁面或服務時,會引用緩存的程序集。 當源代碼改變時,CLR重新編譯程序集。

  • 配置緩存 - 應用程序範圍的配置信息存儲在配置文件中。 配置緩存將配置信息存儲在服務器內存中。

在本教程中,我們將考慮輸出緩存,數據緩存和對象緩存。

輸出緩存

渲染頁面可能涉及一些複雜的過程,如數據庫訪問,渲染複雜的控件等。輸出緩存允許通過緩存內存中的數據繞過服務器往返。即使整個頁面也可以被緩存。

OutputCache指令負責輸出緩存。它啓用輸出緩存並提供對其行爲的一定控制。

OutputCache指令的語法:

<%@ OutputCache Duration="15" VaryByParam="None" %>

把這個指令放在page指令下。這告訴環境緩存頁面15秒。 以下用於頁面加載的事件處理程序將有助於測試頁面是否真正被緩存。

protected void Page_Load(object sender, EventArgs e)
{
   Thread.Sleep(10000);  
   Response.Write("This page was generated and cache at:" +
   DateTime.Now.ToString());
}

Thread.Sleep()方法在指定的時間內停止進程線程。 在這個例子中,線程停止了10秒,所以當第一次加載頁面時,需要10秒。 但是,下次刷新頁面時,不需要任何時間,因爲頁面是從緩存中檢索的而不是重新加載的。

OutputCache指令具有以下屬性,這有助於控制輸出緩存的行爲:

編號

屬性

描述

1

DiskCacheable

true/false

指定可以將輸出寫入基於磁盤的緩存。

2

NoStore

true/false

指定是否發送「無存儲」緩存控制標題。

3

CacheProfile

字符串名稱

要存儲在web.config中的緩存配置文件的名稱。

4

VaryByParam

None * Param-name

以分號分隔的字符串列表指定POST請求中或GET請求變量中的查詢字符串值。

5

VaryByHeader

*Header names

以分號分隔的字符串列表指定可能由客戶端提交的標頭。

6

VaryByCustom

瀏覽器 自定義字符串

告訴ASP.NET通過瀏覽器名稱和版本或自定義字符串來改變輸出緩存。

7

Location

Any Client Downstream Server None

Any:頁面可能被緩存在任何地方。Client:緩存的內容保留在瀏覽器中。Downstream:存儲在下游和服務器中的緩存內容。Server:僅在服務器上保存的緩存內容。

8

Duration

數字

頁面或控件被緩存的秒數。

添加一個文本框和一個按鈕到前面的例子,並添加這個按鈕的事件處理程序。

protected void btnmagic_Click(object sender, EventArgs e)
{
   Response.Write("<br><br>");
   Response.Write("<h2> Hello, " + this.txtname.Text + "</h2>");
}

更改OutputCache指令:

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

程序執行時,ASP.NET會根據文本框中的名稱來緩存頁面。

數據緩存

數據緩存的主要方面是緩存數據源控件。 我們已經討論過,數據源控件代表數據源中的數據,如數據庫或XML文件。這些控件派生自抽象類DataSourceControl,並具有以下用於實現緩存的繼承屬性:

  • CacheDuration - 它設置數據源將緩存數據的秒數。
  • CacheExpirationPolicy - 它定義緩存中的數據到期時的緩存行爲。
  • CacheKeyDependency - 它標識一個控件的關鍵字,用於在刪除時自動使其緩存內容過期。
  • EnableCaching - 指定是否緩存數據。

示例

爲了演示數據緩存,創建一個新的網站並在其上添加一個新的Web表單。 使用數據訪問教程中已經使用的數據庫連接添加一個SqlDataSource控件。

對於這個例子,添加一個標籤到頁面,這將顯示頁面的響應時間。

<asp:Label ID="lbltime" runat="server"></asp:Label>

內容頁面除了標籤之外,與數據訪問教程中的內容頁面相同。 爲頁面加載事件添加一個事件處理程序:

protected void Page_Load(object sender, EventArgs e)
{
   lbltime.Text = String.Format("Page posted at: {0}", DateTime.Now.ToLongTimeString());
}

設計好的頁面應該如下所示:

ASP.NET緩存

當您第一次執行頁面時,沒有什麼不同,標籤顯示,每次刷新頁面時,頁面都會重新加載,並且標籤上顯示的時間會發生變化。

接下來,將數據源控件的EnableCaching屬性設置爲true,並將Cacheduration屬性設置爲60。 它將實現緩存,緩存將每60秒過期。

每次刷新都會更改時間戳,但如果在60秒內更改了表中的數據,則在緩存過期之前不會顯示該數據。

參考以下代碼 -

<asp:SqlDataSource ID = "SqlDataSource1" runat = "server" 
   ConnectionString = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString %>" 
   ProviderName = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString.ProviderName %>" 
   SelectCommand = "SELECT * FROM [DotNetReferences]"
   EnableCaching = "true" CacheDuration = "60">         
</asp:SqlDataSource>

對象緩存

對象緩存比其他緩存技術提供更多的靈活性。 可以使用對象緩存將任何對象放置在緩存中。 該對象可以是任何類型 - 數據類型,Web控件,類,數據集對象等。只需通過分配新的鍵名稱即可將該項添加到緩存中,如下所示:

Cache["key"] = item;

ASP.NET還提供了將對象插入緩存的Insert()方法。 此方法有四個重載版本。如下所列 -

編號

方法

描述

1

Cache.Insert((key, value);

使用鍵名稱和值將項目插入高速緩存,默認優先級和到期。

2

Cache.Insert(key, value, dependencies);

將項目插入高速緩存中,其中包含鍵值,默認優先級,到期時間以及鏈接到其他文件或項目的CacheDependency名稱,以便在更改緩存項目時不再有效。

3

Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration);

這表明與上述問題一起的到期策略。

4

Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration, priority, onRemoveCallback);

這個參數和參數也允許設置緩存項目的優先級和一個委託,指向一個方法被調用時,該項目被刪除。

滑動到期用於在指定的時間間隔內未使用時從緩存中刪除項目。 以下代碼片段存儲滑動過期時間爲10分鐘,不具有依賴性。

Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));

示例

用一個按鈕和一個標籤創建一個頁面。 在頁面加載事件中寫入以下代碼:

protected void Page_Load(object sender, EventArgs e)
{
   if (this.IsPostBack)
   {
      lblinfo.Text += "Page Posted Back.<br/>";
   }
   else
   {
      lblinfo.Text += "page Created.<br/>";
   }

   if (Cache["testitem"] == null)
   {
      lblinfo.Text += "Creating test item.<br/>";
      DateTime testItem = DateTime.Now;
      lblinfo.Text += "Storing test item in cache ";
      lblinfo.Text += "for 30 seconds.<br/>";
      Cache.Insert("testitem", testItem, null, 
      DateTime.Now.AddSeconds(30), TimeSpan.Zero);
   }
   else
   {
      lblinfo.Text += "Retrieving test item.<br/>";
      DateTime testItem = (DateTime)Cache["testitem"];
      lblinfo.Text += "Test item is: " + testItem.ToString();
      lblinfo.Text += "<br/>";
   }

   lblinfo.Text += "<br/>";
}

當頁面第一次被加載時,輸出爲:

Page Created.
Creating test item.
Storing test item in cache for 30 seconds.

如果您在30秒內再次單擊該按鈕,頁面將被回發,但標籤控件從緩存中獲取其信息,如下所示:

Page Posted Back.
Retrieving test item.
Test item is: 14-07-2017 22:25:34

易百教程移動端:請掃描本頁面底部(右側)二維碼並關注微信公衆號,回覆:"教程" 選擇相關教程閱讀或直接訪問:http://m.yiibai.com

上一篇:ASP.NET安全 下一篇:ASP.NET Web Services

加QQ羣啦,易百教程官方技術學習羣

QQ羣名稱

羣號

人數

免費

等級

羣介紹

JAVA技術

227270512

2000

LV5

Java基礎,JSP(Servlet),JAVA框架,Java高併發架構,Maven等等

MySQL/SQL

418407075

2000

LV5

SQL基礎,MySQL基礎,MySQL存儲過程,視圖,觸發器等等

大數據開發

655154550

2000

LV5

Spark,zookeeper,kafka,CDH,hive,fulme,hbase等Hadoop雲計算生態圈技術

Python技術

287904175

2000

LV5

Python編程,Python Web,Python大數據,Python爬蟲,自然語言處理等

Linux技術

479429477

2000

LV1

Redhat/Centos,Ubuntu,Shell,運維,監控等技術

PHP/Web開發者

460153241

1000

LV0

PHP基礎,PHP高級,網站優化/架構,JS,HTML,JQuery,前端等Web開發技術

人工智能

456236082

1000

LV0

人工智能,深度學習,算法等技術

Oracle數據庫

175248146

1000

LV0

SQL基礎,Oracle基礎,Oracle存儲過程,視圖,觸發器等等

Android開發

159629185

1000

LV0

Android開發,Android Studio,Kotlin,Dagger等技術

微軟技術

579821706

1000

LV0

C#,ASP.Net,VB.Net,ADO.Net,SQL Server,VBA,Excel等技術

測試工程師

415553199

1000

LV0

軟件測試,硬件測試,測試平臺開發,黑白盒測試,Labview,C/C++, Java/.net; 軟件開發,遊戲開發等技術