服務熱線
153 8323 9821
緩存學術一些的解釋是”將常用數據放入易于讀取的地方以提高性能”。而對于Asp.net來說,需要被緩存的對象多種多樣,包括從數據庫中提取出來的數據,以及aspx頁面生成的靜態頁,甚至是編譯好的程序集。合理利用緩存能讓Asp.net的性能大幅提升,下面將對Asp.net中的緩存機制進行簡單概述。
在Asp.net中,大部分緩存機制是保存在cache對象中,也就是服務器內存的一部分。當用戶請求數據時,如果數據已經被緩存,則用戶所提取的數據直接從服務端返回,而不是從數據庫等底層數據庫提取。這對性能的提升不得不說很有幫助。下面來看asp.net中幾種緩存機制。
簡單的說,這種緩存是asp.net自帶的,無需開發人員進行參與的緩存方式。即當第一次請求服務器時,Page類以及相關程序集被編譯,當下次請求時,訪問緩存后的編譯而不是重新編譯。CLR會自動檢測代碼的改變,如果代碼改變后,當下次訪問時,相關代碼會被重新編譯。
數據源緩存,顧名思義,也就是利用數據源控件對獲取的數據進行緩存的方式。這些控件包括SqlDataSource,ObjectDataSource等:
作為抽象類的DataSourceControl暴漏了如下屬性用于緩存:
| 名稱 | 說明 |
| CacheDuration | 獲取或設置以秒為單位的一段時間,數據源控件就在這段時間內緩存 SelectMethod 屬性檢索到的數據。 |
| CacheExpirationPolicy | 獲取或設置緩存的到期行為,該行為與持續時間組合在一起可以描述數據源控件所用緩存的行為。 |
| CacheKeyDependency | 獲取或設置一個用戶定義的鍵依賴項,該鍵依賴項鏈接到數據源控件創建的所有數據緩存對象。 |
| EnableCaching | 獲取或設置一個值,該值指示 ObjectDataSource 控件是否啟用數據緩存。 |
而使用起來就非常簡單了,只需要將緩存的相關屬性進行設置即可。比如我想要當前數據源緩存10秒,只需要設置EnableCaching屬性和CacheDuration屬性如下:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>" SelectCommand="SELECT top 10 * FROM [Person].[Contact]" EnableCaching="true" CacheDuration="10"></asp:SqlDataSource>
這種方式的工作原理可以用下圖表示:
關于ObjectDataSource我推薦閱讀Caching Data with the ObjectDataSource
大家應該注意到了上面的數據源控件還暴漏了CacheKeyDependency屬性,這是用于實現SQL Cache Dependency的方式,關于Dependency,其實就是在數據庫表內容改變時,將相應的緩存進行更新,正如Dependency這個詞的意思一樣,是緩存依賴底層數據庫。下面就要說到兩種實現SQL Cache Dependency的方法了。
方法一:使用輪流查詢機制(polling-based):
這種方式實現機制是在sql server中插入以AspNet_SqlCacheNotification_Trigger開頭的一個特殊的表和5個存儲過程,當被監測的表數據發生改變時,則一個名為AspNet_SqlCacheTablesForChangeNotification的表被更新,而Asp.net程序會根據用戶設置的間隔時間每隔一定時間檢查一下數據庫內容是否更新,如果更新,則將緩存中的數據進行跟新。
這種機制配置相對比較麻煩。具體做法網上有很多教程,這里我推薦閱讀:Using SQL Cache Dependencies.
使用起來就很簡單了,可以在頁面頭部的OutputCache指令中設置,會社DataSource空間中進行設置,設置格式為:“數據庫名:表名”.里面的表名即是需要監測是否改變的表名,示例如下:
<%@ OutputCache Duration="30" VaryByParam="none" SqlDependency="DatabaseName:tableName" %>
如果需要添加多個表,則用”;”進行分割
SqlDependency="database:table;database:table"
方法二:使用通知機制(notification-based)
使用通知機制配置起來要簡便很多,但是sql server的版本需要9.0以上,也就是sql server 2005,使用這種方式需要將sql server的通知服務開啟。
使用通知機制可以對頁面進行緩存,也可以對datasouce控件進行緩存,對頁面進行緩存代碼如下:
<%@ OutputCache Duration="30" VaryByParam="none" SqlDependency="CommandNotification" %>
注意SqlDependency必須設置成CommandNotification。
對于datasource控件,也是同樣:
上一篇:ASP.NET頁面事件執行順序