[.net 物件導向程式設計進階] (15) 快取(Cache)(二) 利用快取提升程式效能

yubinfeng發表於2015-07-16

[.net 物件導向程式設計進階] (15) 快取(Cache)(利用快取提升程式效能

本節導讀:

上節說了快取是以空間來換取時間的技術,介紹了客戶端快取和兩種常用伺服器緩布,本節主要介紹一種.NET中特別重要的緩布技術Cache.利用Cache提升程式效能。

1. 快取Cache的名稱空間

.NET中對快取有兩個名稱空間

名稱空間1:System.Web.Caching 

名稱空間2:System.Runtime.Caching

引用範圍:這兩個名稱空間,都可以在Web和非WEB應用程式中引用.

生命週期:理論上來說是一直存在,我們可以設定過期時間。但當記憶體開銷緊張的時候,也會清理快取釋放空間。因此我們後面的程式應用中會判斷Cache的物件是否存在,不存在的情況下,重新建立來解決失效問題。

下面介紹一下快取的具體使用方法。

2. 建立和讀取快取

快取也是對向物件的,我們先建立一個實體類,還是比較熟悉的 “武功高手”類: 

/// <summary>
/// 類:武林高手
/// MartialArtsMaster
/// </summary>
    public class MartialArtsMaster
{
    /// <summary>
    /// 編號
    /// </summary>
    public int id { get; set; }

    /// <summary>
    /// 姓名
    /// </summary>
    public string name { get; set; }


    /// <summary>
    /// 門派
    /// </summary>
    public string menpai { get; set; }           
    /// <summary>
    /// 武功
    /// </summary>
    public string kongFu { get; set; }

}

下面我們建立一個快取,並讀快取,遍歷物件 

//增加幾個武林高手
List<MartialArtsMaster> masterList = new List<MartialArtsMaster>() {
    new MartialArtsMaster(){ id=1, name="段譽", menpai="天龍寺", kongFu="六脈神劍"},
    new MartialArtsMaster(){ id=2, name="喬峰", menpai="丐幫", kongFu="降龍十八掌"},
    new MartialArtsMaster(){ id=3, name="虛竹", menpai="逍遙派", kongFu="北冥神功"}
};
//快取的建立
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert("MyCache", masterList);
//快取的讀取
(objCache["MyCache"] as List<MartialArtsMaster>).ForEach(m => Console.WriteLine("名字:" + m.name + " 門派:" + m.menpai + " 武功:" + m.kongFu));

執行結果如下:

3. 常見的快取在工廠反射模式中的應用

我們這裡先不討論設計模式,但是在使用很多程式碼生成器的時候,對於工廠反射模式動態建立多個資料層介面時,常常使用了快取技術,將動態反射 建立的類快取起來,提高下次訪問效率。

下面是簡單工廠反射模式中的快取應用程式碼片段:

object objType = GetCache(ClassName);//從快取讀取
if (objType == null)
{
    try
    {
        objType = Assembly.Load(AssemblyPath).CreateInstance(ClassName);//反射建立
        SetCache(ClassNamespace, objType);// 寫入快取
    }
    catch(Exception ex)
    { }
}

4. 快取的使用原則

快取有效的提高了程式效率,但也要合理使用,下面是幾種使用的原則:

第一,資料可能會被頻繁的被使用,這種資料可以快取。

第二,資料的訪問頻率非常高,或者一個資料的訪問頻率不高,但是它的生存週期很長,這樣的資料最好也快取起來。

第三是在Asp.net中,如果快取過大的話也會報記憶體溢位錯誤,特別是如果快取大的DataSet物件的時候。

根據實際情況來合理利用。如:cache用得過多也會增大伺服器的壓力。整頁輸出快取,又會影響資料的更新。 如果真的需要快取很大量的資料,可以考慮靜態技術。

 5. 通用快取類

最後慣例,整理一個快取的通用類,以供小夥伴們呼叫  

名稱空間:KaJiMao.Common  

類名:CacheHelper  

檔名:CacheHelper .cs 

using System;
using System.Web;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace KaJiMao.Common
{

    /// <summary>
    /// Cache通用類
    /// Yubinfeng
    /// Date:2015/07/16
    public class CacheHelper
    {
        /// <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());
            }
        }
    }
}
View Code

==============================================================================================  

 返回目錄

 <如果對你有幫助,記得點一下推薦哦,如有有不明白或錯誤之處,請多交流>  

<對本系列文章閱讀有困難的朋友,請先看《.net 物件導向程式設計基礎》>

<轉載宣告:技術需要共享精神,歡迎轉載本部落格中的文章,但請註明版權及URL>

.NET 技術交流群:467189533    .NET 程式設計

==============================================================================================   

相關文章