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


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM