[.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()); } } } }
==============================================================================================
<若是對你有幫助,記得點一下推薦哦,若有有不明白或錯誤之處,請多交流>
<對本系列文章閱讀有困難的朋友,請先看《.net 面向對象編程基礎》>
<轉載聲明:技術須要共享精神,歡迎轉載本博客中的文章,但請註明版權及URL>
==============================================================================================