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