1. 程式人生 > >ASP.NET cache快取的用法

ASP.NET cache快取的用法

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# 程式碼 
<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>
三、實戰,個人專案 1、第一步,在global.asax 加入
<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;
            }