ASP.NET cache快取的用法
阿新 • • 發佈:2019-01-01
1、HttpRuntime.Cache 相當於就是一個快取具體實現類,這個類雖然被放在了 System.Web 名稱空間下了。但是非 Web 應用也是可以拿來用的。
2、HttpContext.Cache 是對上述快取類的封裝,由於封裝到了 HttpContext ,侷限於只能在知道 HttpContext 下使用,即只能用於 Web 應用。
綜上所屬,在可以的條件,儘量用 HttpRuntime.Cache ,而不是用 HttpContext.Cache 。
一、有以下幾條快取資料的規則
第一,資料可能會被頻繁的被使用,這種資料可以快取。
第二,資料的訪問頻率非常高,或者一個數據的訪問頻率不高,但是它的生存週期很長,這樣的資料最好也快取起來。
第三是一個常常被忽略的問題,有時候我們快取了太多資料,通常在一臺X86的機子上,如果你要快取的資料超過800M的話,就會出現記憶體溢位的錯誤。所以說快取是有限的。換名話說,你應該估計快取集的大小,把快取集的大小限制在10以內,否則它可能會出問題。在Asp.net中,如果快取過大的話也會報記憶體溢位錯誤,特別是如果快取大的DataSet物件的時候。
你應該認真分析你的程式。根據實際情況來看哪裡該用,哪裡不該用。如:cache用得過多也會增大伺服器的壓力。整頁輸出快取,又會影響資料的更新。 如果真的需要快取很大量的資料,可以考慮靜態技術。
二、下面介紹HttpRuntime.Cache常用方法
C# 程式碼三、實戰,個人專案 1、第一步,在global.asax 加入<strong>using System; using System.Web; using System.Collections; public class CookiesHelper { /**//// <summary> /// 獲取資料快取 /// </summary> /// <param name="CacheKey">鍵</param> public static object GetCache(string CacheKey) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; return objCache[CacheKey]; } /**//// <summary> /// 設定資料快取 /// </summary> public static void SetCache(string CacheKey, object objObject) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; objCache.Insert(CacheKey, objObject); } /**//// <summary> /// 設定資料快取 /// </summary> public static void SetCache(string CacheKey, object objObject, TimeSpan Timeout) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; objCache.Insert(CacheKey, objObject, null, DateTime.MaxValue, Timeout, System.Web.Caching.CacheItemPriority.NotRemovable, null); } /**//// <summary> /// 設定資料快取 /// </summary> public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration); } /**//// <summary> /// 移除指定資料快取 /// </summary> public static void RemoveAllCache(string CacheKey) { System.Web.Caching.Cache _cache = HttpRuntime.Cache; _cache.Remove(CacheKey); } /**//// <summary> /// 移除全部快取 /// </summary> public static void RemoveAllCache() { System.Web.Caching.Cache _cache = HttpRuntime.Cache; IDictionaryEnumerator CacheEnum = _cache.GetEnumerator(); while (CacheEnum.MoveNext()) ...{ _cache.Remove(CacheEnum.Key.ToString()); } } } </strong>
<strong> void Application_Start(object sender, EventArgs e)
{
// 在應用程式啟動時執行的程式碼
try
{
//定義連線字串
string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
System.Data.SqlClient.SqlDependency.Start(conStr);//啟動監聽服務,ps:只需啟動一次
System.Web.Caching.SqlCacheDependencyAdmin.EnableNotifications(conStr);//設定通知的資料庫連線,ps:只需設定一次
string[] str = { "TMS_OptionScoreDetails", "TMS_TeachAssess", "TMS_TeachAssessDetail", "TMS_TeachAssessPublish", "TMS_TeachAssessRecord", "TMS_TeachAssessRecordDetails", "TMS_TeachOption" };
System.Web.Caching.SqlCacheDependencyAdmin.EnableTableForNotifications(conStr, str);//設定通知的資料庫連線和表,ps:只需設定一次
}
catch
{
}
}
</strong>
2、第二步,在引用快取類,並在專案用應用。 //快取
DataSet myDataSet = new DataSet();
string CacheKey = "SearchDate" + TeachAssessID;
object objModel = TMSCommonMethod.GetCache(CacheKey);//從快取中獲取
if (objModel == null)//快取裡沒有
{
TMSTeachAssessDetailManager myTMSTeachAssessDetailManager = new TMSTeachAssessDetailManager();
TMSTeachAssessDetailQuery myTMSTeachAssessDetailQuery = new TMSTeachAssessDetailQuery();
//myTMSTeachAssessDetailQuery.TeachAssessPublishID = TeachAssessPublishID;
myTMSTeachAssessDetailQuery.TeachAssessID = TeachAssessID;
myDataSet = myTMSTeachAssessDetailManager.SearchDate(null, myTMSTeachAssessDetailQuery);
objModel = myDataSet;//把資料存入快取
if (objModel != null)
{
System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency(ConfigurationManager.AppSettings["CacheDataBaseName"].ToString(), TMSTeachAssessDetail.TABLENAME);
TMSCommonMethod.SetCache(CacheKey, objModel, dep);//寫入快取
}
}
else
{
myDataSet = (DataSet)objModel;
}