[.net 面向對象程序設計進階] (15) 緩存(Cache)(二) 利用緩存提高程序性能

[.net 面向對象程序設計進階] (15) 緩存(Cache)(利用緩存提高程序性能html

本節導讀:編程

上節說了緩存是以空間來換取時間的技術,介紹了客戶端緩存和兩種經常使用服務器緩布,本節主要介紹一種.NET中特別重要的緩布技術Cache.利用Cache提高程序性能。設計模式

1. 緩存Cache的命名空間緩存

.NET中對緩存有兩個命名空間服務器

命名空間1:System.Web.Caching ide

命名空間2:System.Runtime.Caching性能

引用範圍:這兩個命名空間,均可以在Web和非WEB應用程序中引用.spa

生命週期:理論上來講是一直存在,咱們能夠設置過時時間。但當內存開銷緊張的時候,也會清理緩存釋放空間。所以咱們後面的程序應用中會判斷Cache的對象是否存在,不存在的狀況下,從新建立來解決失效問題。.net

下面介紹一下緩存的具體使用方法。設計

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 程序設計

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

相關文章
相關標籤/搜索