[.net面向?qū)ο蟪绦蛟O(shè)計進階](15)緩存(Cache)(二)利用緩存提升程序性能
本節(jié)導讀:
上節(jié)說了緩存是以空間來換取時間的技術(shù),介紹了客戶端緩存和兩種常用服務(wù)器緩布,本節(jié)主要介紹一種.NET中特別重要的緩布技術(shù)Cache.利用Cache提升程序性能。
1. 緩存Cache的命名空間
.NET中對緩存有兩個命名空間
命名空間1:System.Web.Caching
命名空間2:System.Runtime.Caching
引用范圍:這兩個命名空間,都可以在Web和非WEB應(yīng)用程序中引用.
生命周期:理論上來說是一直存在,我們可以設(shè)置過期時間。但當內(nèi)存開銷緊張的時候,也會清理緩存釋放空間。因此我們后面的程序應(yīng)用中會判斷Cache的對象是否存在,不存在的情況下,重新創(chuàng)建來解決失效問題。
下面介紹一下緩存的具體使用方法。
2. 創(chuàng)建和讀取緩存
緩存也是對向?qū)ο蟮模覀兿葎?chuàng)建一個實體類,還是比較熟悉的“武功高手”類:
/// <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; }}下面我們創(chuàng)建一個緩存,并讀緩存,遍歷對象
//增加幾個武林高手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="北冥神功"}};//緩存的創(chuàng)建System.Web.Caching.Cache objCache = Htt運行結(jié)果如下:

3. 常見的緩存在工廠反射模式中的應(yīng)用
我們這里先不討論設(shè)計模式,但是在使用很多代碼生成器的時候,對于工廠反射模式動態(tài)創(chuàng)建多個數(shù)據(jù)層接口時,常常使用了緩存技術(shù),將動態(tài)反射創(chuàng)建的類緩存起來,提高下次訪問效率。
下面是簡單工廠反射模式中的緩存應(yīng)用代碼片段:
object objType = GetCache(ClassName);//從緩存讀取if (objType == null){ try { objType = Assembly.Load(AssemblyPath).CreateInstance(ClassName);//反射創(chuàng)建 SetCache(ClassNamespace, objType);// 寫入緩存 } catch(Exception ex) { }}4. 緩存的使用原則
緩存有效的提高了程序效率,但也要合理使用,下面是幾種使用的原則:
第一,數(shù)據(jù)可能會被頻繁的被使用,這種數(shù)據(jù)可以緩存。
第二,數(shù)據(jù)的訪問頻率非常高,或者一個數(shù)據(jù)的訪問頻率不高,但是它的生存周期很長,這樣的數(shù)據(jù)最好也緩存起來。
第三是在asp.net
中,如果緩存過大的話也會報內(nèi)存溢出錯誤,特別是如果緩存大的DataSet對象的時候。根據(jù)實際情況來合理利用。如:cache用得過多也會增大服務(wù)器的壓力。整頁輸出緩存,又會影響數(shù)據(jù)的更新。如果真的需要緩存很大量的數(shù)據(jù),可以考慮靜態(tài)技術(shù)。
5. 通用緩存類
最后慣例,整理一個緩存的通用類,以供小伙伴們調(diào)用
命名空間: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> /// 獲取數(shù)據(jù)緩存 /// </summary> /// <param name="CacheKey">鍵</param> public static object GetCache(string CacheKey) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; return objCache[CacheKey]; } /// <summary> /// 設(shè)置數(shù)據(jù)緩存 /// </summary> public static void SetCache(string CacheKey, object objObject) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; objCache.Insert(CacheKey, objObject); } /// <summary> /// 設(shè)置數(shù)據(jù)緩存 /// </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> /// 設(shè)置數(shù)據(jù)緩存 /// </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> /// 移除指定數(shù)據(jù)緩存 /// </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面向?qū)ο缶幊袒A(chǔ)》>
<轉(zhuǎn)載聲明:技術(shù)需要共享精神,歡迎轉(zhuǎn)載本博客中的文章,但請注明版權(quán)及URL>
.NET 技術(shù)交流群:467189533 
==============================================================================================
新聞熱點
疑難解答