网站性能优化之应用程序缓存-初篇
?
一. 摘要
????? 首先聲明這篇服務(wù)器緩存篇是我平時(shí)工作中的一些經(jīng)驗(yàn)心得,對(duì)沒(méi)有用過(guò),或者不知道如何使用服務(wù)器緩存的朋友們提供一個(gè)簡(jiǎn)單的認(rèn)識(shí)與實(shí)現(xiàn)思路,本文只是拋
磚引玉,還請(qǐng)各位多多提出寶貴意見(jiàn),希望能夠在大家的指導(dǎo)下寫(xiě)出更好的經(jīng)驗(yàn)總結(jié),為更多的不會(huì)使用或者不知道如何下手的朋友們提供幫助。
????? 閑話,之前寫(xiě)的部分文章可能條理性也不是特別清楚,特別參考博客園部分大牛的組織形式來(lái)書(shū)寫(xiě),通過(guò)清晰的文章結(jié)構(gòu),不但能讓自己寫(xiě)文章的時(shí)候思路清晰,
更能為看到這篇文章的朋友理解我講解的目的,這就是最好的結(jié)果啦。
????? 本人主要講解的內(nèi)容:通過(guò)程序代碼來(lái)實(shí)現(xiàn)ASP.NET網(wǎng)站的緩存功能。
二. 本文提綱
· 1.摘要
· 2.本文提綱
· 3.服務(wù)器緩存簡(jiǎn)介
· 4.準(zhǔn)備工作
· 5.第一個(gè)簡(jiǎn)單程序
· 6.程序配置與部署
· 7.本文總結(jié)
三. 服務(wù)器緩存簡(jiǎn)介
緩存的優(yōu)勢(shì): 緩存是一種無(wú)需大量時(shí)間和分析就可以獲得"足夠良好的"性能的方法。這里再次強(qiáng)調(diào),內(nèi)存現(xiàn)在非常便宜,因此,如果您能通過(guò)將輸出緩存 30 秒, 而不是花上一整天甚至一周的時(shí)間嘗試優(yōu)化代碼或數(shù)據(jù)庫(kù)就可以獲得所需的性能,您肯定會(huì)選擇緩存解決方案(假設(shè)可以接受 30 秒的舊數(shù)據(jù))。 緩存正是那些利用 20% 付出獲得 80% 回報(bào)的特性之一,因此,要提高性能,應(yīng)該首先想到緩存。不過(guò),如果設(shè)計(jì)很糟糕, 最終卻有可能帶來(lái)不良的后果,因此,您當(dāng)然也應(yīng)該盡量正確地設(shè)計(jì)應(yīng)用程序。但如果您只是需要立即獲得足夠高的性能,緩存就是您的最佳選擇, 您可以在以后有時(shí)間的時(shí)候再盡快重新設(shè)計(jì)應(yīng)用程序。 緩存的使用原則: 盡早緩存;經(jīng)常緩存 您應(yīng)該在應(yīng)用程序的每一層都實(shí)現(xiàn)緩存。向數(shù)據(jù)層、業(yè)務(wù)邏輯層、UI 或輸出層添加緩存支持。 內(nèi)存現(xiàn)在非常便宜 — 因此,通過(guò)以智能的方式在整個(gè)應(yīng)用程序中實(shí)現(xiàn)緩存,可以獲得很大的性能提高。 緩存的過(guò)期策略在緩存部署后也將將起到?jīng)Q定性的作用。 ? 通過(guò)上面的介紹我們已經(jīng)找到了緩存的重要性,所以我們?cè)谧鲂阅軆?yōu)化時(shí)能用緩存的時(shí)候,盡量用緩存吧。應(yīng)用程序數(shù)據(jù)緩存
????? 應(yīng)用程序數(shù)據(jù)緩存提供了一種編程方式,可通過(guò)鍵/值對(duì)將任意數(shù)據(jù)存儲(chǔ)在內(nèi)存中。使用應(yīng)用程序緩存與使用應(yīng)用程序狀態(tài)類似。但是,與應(yīng)用程序狀態(tài)不同的是,
應(yīng)用程序數(shù)據(jù)緩存中的數(shù)據(jù)是易失的,即數(shù)據(jù)并不是在整個(gè)應(yīng)用程序生命周期中都存儲(chǔ)在內(nèi)存中。應(yīng)用程序數(shù)據(jù)緩存的優(yōu)點(diǎn)是由ASP.NET管理緩存,它會(huì)在項(xiàng)過(guò)期、無(wú)
效,或內(nèi)存不足時(shí)移除緩存中的項(xiàng),還可以配置應(yīng)用程序緩存,以便在移除項(xiàng)時(shí)通知應(yīng)用程序。
四. 準(zhǔn)備工作
????? 既然要使用緩存,我們首先要知道ASP.NET開(kāi)發(fā)中VS平臺(tái)可給我提供了什么樣的方法去實(shí)現(xiàn)這個(gè)緩存服務(wù),首先給大家介紹的就是System.Web.Caching.Cache類,這個(gè)類負(fù)責(zé)Web服務(wù)器中緩存的管理。
?
我們先來(lái)看看這個(gè)類下的相關(guān)成員及每個(gè)成員的工作是什么?//獲取緩存集合中的總數(shù) public int Count{get;}//這個(gè)屬性用來(lái)查看緩存服務(wù)在服務(wù)器中可用的物理內(nèi)存的百分比public long EffectivePercentagePhysicalMemoryLimit{get;}//獲取或設(shè)置緩存對(duì)象public object this[string key]{get;set;} public object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback); //檢索到的緩存項(xiàng),未找到該鍵時(shí)為 null。 public object Get(string key); //返回一個(gè)可枚舉的集合 public IDictionaryEnumerator GetEnumerator(); public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback);public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);五. 第一個(gè)簡(jiǎn)單程序
????? 程序中可以寫(xiě)一個(gè)單獨(dú)的CacheHelper包裝相應(yīng)的緩存方法,通過(guò)在程序中調(diào)用緩存,來(lái)實(shí)現(xiàn)相應(yīng)的優(yōu)化目的,
?
??????首先這個(gè)類中的所有成員是靜態(tài)成員,這樣可以不用創(chuàng)建對(duì)象
?
/// <summary>/// 初始化服務(wù)器緩存/// </summary>private static System.Web.Caching.Cache cache = HttpRuntime.Cache;//這里是默認(rèn)取當(dāng)前應(yīng)用程序的服務(wù)緩存。 /// <summary>/// 返回指定的緩存信息/// </summary>/// <param name="key">鍵</param>/// <returns>緩存信息</returns>public static object Get(string key){return cache[key];} /// <summary>/// 刪除指定鍵的緩存/// </summary>/// <param name="key">鍵</param>/// <returns>緩存信息</returns>public static bool Remove(string key){return !(null==cache.Remove(key));} /// <summary>/// 添加緩存信息/// </summary>/// <param name="key">鍵</param>/// <param name="value">要緩存的信息</param>public static void Set(string key, object value){cache.Insert(key, value,null,System.Web.Caching.Cache.NoAbsoluteExpiration,TimeSpan.FromMinutes(3));} /// <summary>/// 判定是否存在知道鍵的緩存信息/// </summary>/// <param name="key">鍵</param>/// <returns>是否存在</returns>public static bool Exist(string key){return !(null == cache[key]);} /// <summary>/// 添加緩存信息/// </summary>/// <param name="key">鍵</param>/// <param name="value">要緩存的信息</param>/// <param name="datetime">過(guò)期時(shí)間</param>public static void Set(string key, object value,DateTime datetime){cache.Insert(key, value, null,datetime,System.Web.Caching.Cache.NoSlidingExpiration);} /// <summary>/// 添加緩存信息/// </summary>/// <param name="key">鍵</param>/// <param name="value">值</param>/// <param name="swcc">緩存對(duì)象的依賴關(guān)系</param>public static void Set(string key, object value, System.Web.Caching.CacheDependency swcc){cache.Insert(key, value, swcc, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(3), System.Web.Caching.CacheItemPriority.Default, null);}?
?????? 具體的緩存讀取修改代碼如下:
?
//定義一個(gè)泛型集合用來(lái)保存相應(yīng)的實(shí)體,或者是datatable都是可以的。 private static Dictionary<int, EasyStore.Model.Product.Productclass> productClass = new Dictionary<int, EasyStore.Model.Product.Productclass>(); /// <summary>/// 獲取產(chǎn)品分類名稱/// </summary>/// <param name="cid">產(chǎn)品分類ID</param>/// <returns>產(chǎn)品分類名稱</returns>public static string GetProductClassName(int cid){string className = string.Empty; //判定緩存中是否存在指定鍵的緩存對(duì)象 if (!CacheHelper.Exist(productClass.GetHashCode().ToString())){EasyStore.BLL.Product.Productclass cBll = new EasyStore.BLL.Product.Productclass();List<EasyStore.Model.Product.Productclass> models = cBll.GetAll();foreach (EasyStore.Model.Product.Productclass model in models){if (!productClass.ContainsKey(model.ID))//將實(shí)體添加到緩存列表中productClass.Add(model.ID, model);} //緩存存儲(chǔ)實(shí)體的集合對(duì)象CacheHelper.Set(productClass.GetHashCode().ToString(), productClass);}else{判定緩存中是否存在指定鍵的緩存對(duì)象,存在則直接從緩存中取出指定鍵的對(duì)象,并強(qiáng)制轉(zhuǎn)換為指定實(shí)體集合對(duì)象。productClass = CacheHelper.Get(productClass.GetHashCode().ToString()) as Dictionary<int, EasyStore.Model.Product.Productclass>;} //其他操作。className = productClass.ContainsKey(cid) ? productClass[cid].Name : string.Empty; return className;}?
? 業(yè)務(wù)代碼中的調(diào)用
?
??????? 上面大概給出了緩存的相關(guān)代碼,其他的代碼都類似。
?
//將緩存中指定的鍵的緩存對(duì)象取出 DataTable dt = CacheHelper.Get("DBES_PRODUCTCLASS") as DataTable; //其他業(yè)務(wù)代碼 if (drs != null && drs.Length > 0){foreach (DataRow row in drs){//TODO..}}六. 程序配置與部署
?????? 簡(jiǎn)單的應(yīng)用程序緩存服務(wù),基本上不需要太多的配置與部署,分布式服務(wù)緩存則會(huì)在這方面很重要,接下來(lái)的高級(jí)篇將會(huì)介紹到這個(gè)服務(wù)的具體應(yīng)用,還將講解如
何構(gòu)建高性能的分布式訪問(wèn)緩存服務(wù)器。
七. 本文總結(jié)
緩存可以使應(yīng)用程序的性能得到很大的提高,因此在設(shè)計(jì)應(yīng)用程序以及對(duì)應(yīng)用程序進(jìn)行性能測(cè)試時(shí)應(yīng)該予以考慮。 應(yīng)用程序總會(huì)或多或少地受益于緩存,當(dāng)然有些應(yīng)用程序比其他應(yīng)用程序更適合使用緩存。 對(duì) ASP.NET 提供的緩存選項(xiàng)的深刻理解是任何 ASP.NET 開(kāi)發(fā)人員應(yīng)該掌握的重要技巧。結(jié)束語(yǔ)
????? 本文只是簡(jiǎn)單的說(shuō)明如何通過(guò)應(yīng)用程序的方式實(shí)現(xiàn)緩存,下一篇將如何在應(yīng)用程序中使用緩存的策略和過(guò)期的策略如何設(shè)置,能更好的滿足緩存的服務(wù)做更深入的
說(shuō)明,還希望大家在使用的過(guò)程中對(duì)我提出更好的意見(jiàn)和建議,小弟謝過(guò)!
總結(jié)
以上是生活随笔為你收集整理的网站性能优化之应用程序缓存-初篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通用客户端表单验证函数修正版
- 下一篇: tab与list配合使用