ASP.NET緩存
什麼是緩存?緩存技術是將經常使用的數據/信息存儲在內存中的技術,以便下次需要相同的數據/信息時,可以直接從內存中檢索,而不是由應用程序生成。
緩存對於提高ASP.NET性能非常重要,因爲頁面和控件是在這裏動態生成的。這對於數據相關的事務尤其重要,因爲這些事務在響應時間上是昂貴的。
高速緩存將常用數據放置在快速訪問的媒體中,例如計算機的隨機存取存儲器。 ASP.NET運行時包含稱爲緩存的CLR對象的鍵值映射。 這駐留在應用程序中,可通過HttpContext
和System.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());
}
設計好的頁面應該如下所示:
當您第一次執行頁面時,沒有什麼不同,標籤顯示,每次刷新頁面時,頁面都會重新加載,並且標籤上顯示的時間會發生變化。
接下來,將數據源控件的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; 軟件開發,遊戲開發等技術