緩存是一種將經常使用的數據/信息存儲在內存中的技術,以便下次需要相同的數據/信息時,可以直接從內存中檢索,而不是由應用程式生成。
緩存對於提高ASP.NET的性能非常重要,因爲頁面和控制項是在這裡動態生成的。對於與數據相關的事務尤其重要,因爲這些事務在響應時間方面非常昂貴。
緩存將常用數據放在快速訪問的媒體中,如計算機的隨機訪問內存。NET運行時包含名爲緩存的CLR對象的鍵值映射。它位於應用程式中,可通過HttpContext和System.Web.UI.Page獲得。
在某些方面,緩存類似於存儲狀態對象。然而,在狀態對象中存儲信息是確定的,也就是說,您可以依賴存儲在其中的數據,並且數據的緩存是不確定的。
在下列情況下,數據將不可用:
- If its lifetime expires,
- If the application releases its memory,
- If caching does not take place for some reason.
可以使用索引器訪問緩存中的項,還可以控制緩存中對象的生存期,並在緩存對象及其物理源之間設置連結。
Caching in ASP.Net
ASP.NET提供以下不同類型的緩存:
輸出緩存:輸出緩存存儲最終呈現的HTML頁面的副本或發送到客戶端的部分頁面。當下一個客戶端請求此頁時,將發送該頁的緩存副本,而不是重新生成該頁,從而節省時間。
數據緩存:數據緩存是指從數據源緩存數據。只要緩存未過期,就將從緩存中完成對數據的請求。當緩存過期時,數據源將獲取新數據並重新填充緩存。
對象緩存:對象緩存是緩存頁面上的對象,如數據綁定控制項。緩存的數據存儲在伺服器內存中。
類緩存:首次運行時,網頁或Web服務被編譯爲程序集中的頁類。然後程序集緩存在伺服器中。下次對頁或服務發出請求時,將引用緩存的程序集。當原始碼更改時,CLR重新編譯程序集。
配置緩存:應用程式範圍的配置信息存儲在配置文件中。配置緩存將配置信息存儲在伺服器內存中。
在本教程中,我們將考慮輸出緩存、數據緩存和對象緩存。
Output Caching
呈現頁面可能涉及一些複雜的過程,如資料庫訪問、呈現複雜的控制項等。輸出緩存允許通過在內存中緩存數據繞過到伺服器的往返行程。甚至整個頁面都可以被緩存。
OutputCache指令負責輸出緩存。它啓用輸出緩存並對其行爲提供一定的控制。
OutputCache指令的語法:
<%@ OutputCache Duration="15" VaryByParam="無" %>
將此指令置於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秒。但是,下次刷新頁面時不需要任何時間,因爲頁面是從緩存中檢索而不加載的。
output cache指令具有以下屬性,有助於控制輸出緩存的行爲:
Attribute | Values | Description |
---|---|---|
DiskCacheable | true/false | Specifies that output could be written to a disk based cache. |
NoStore | true/false | Specifies that the "no store" cache control header is sent or not. |
CacheProfile | String name | Name of a cache profile as to be stored in web.config. |
VaryByParam |
無 * Param- name |
Semicolon delimited list of string specifies query string values in a GET request or variable in a POST request. |
VaryByHeader |
* 標題名稱 |
Semicolon delimited list of strings specifies headers that might be submitted by a client. |
VaryByCustom |
瀏覽器 自定義字符串 |
Tells ASP.NET to vary the output cache by browser name and version or by a custom string. |
Location |
任何 顧客 下游 伺服器 無 |
任何: page may be cached anywhere. 顧客: cached content remains at browser. 下游: cached content stored in downstream and server both. 伺服器: cached content saved only on server. 無: disables caching. |
Duration | Number | Number of seconds the page or control is cached. |
讓我們在前面的示例中添加一個文本框和一個按鈕,並爲該按鈕添加此事件處理程序。
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會根據文本框中的名稱緩存頁面。
Data Caching
數據緩存的主要方面是緩存數據源控制項。我們已經討論過數據源控制項表示數據源中的數據,如資料庫或XML文件。這些控制項派生自抽象類DataSourceControl,並具有以下用於實現緩存的繼承屬性:
CacheDuration-它設置數據源緩存數據的秒數。
CacheExpirationPolicy-它定義緩存中的數據過期時的緩存行爲。
cachekeypendency-它標識控制項的鍵,該控制項在移除緩存內容時自動過期。
EnableCaching-它指定是否緩存數據。
Example
要演示數據緩存,請創建一個新網站並在其上添加一個新的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()); }
設計的頁面應如下所示:
當您第一次執行頁面時,沒有發生任何不同的情況,標籤顯示,每次刷新頁面時,頁面都會重新加載,並且標籤上顯示的時間也會更改。
接下來,將數據源控制項的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>
Object Caching
對象緩存比其他緩存技術提供了更大的靈活性。可以使用對象緩存在緩存中放置任何對象。對象可以是任何類型-數據類型、web控制項、類、數據集對象等。只需分配一個新的密鑰名,即可將該項添加到緩存中,如下所示:
Cache["key"] = item;
NET還提供了Insert()方法,用於將對象插入緩存。此方法有四個重載版本。讓我們看看:
Overload | Description |
---|---|
Cache.Insert((key, value); | Inserts an item into the cache with the key name and value with default priority and expiration. |
Cache.Insert(key, value, dependencies); | Inserts an item into the cache with key, value, default priority, expiration and a CacheDependency name that links to other files or items so that when these change the cache item remains no longer valid. |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration); | This indicates an expiration policy along with the above issues. |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration, priority, onRemoveCallback); | This along with the parameters also allows you to set a priority for the cache item and a delegate that, points to a method to be invoked when the item is removed. |
滑動過期用於在指定的時間範圍內不使用項時從緩存中刪除該項。下面的代碼片段存儲了一個滑動過期時間爲10分鐘且不存在依賴項的項。
Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));
Example
創建一個只有按鈕和標籤的頁面。在頁面加載事件中編寫以下代碼:
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秒內再次單擊該按鈕,則頁面將被回發,但label控制項將從緩存獲取其信息,如圖所示: