當系統有100個人同時用,每天8小時,每一分鍾點2個頁面,每個頁面有20條記錄,若程序處理得不好,這個數據庫的I/O壓力也是很大。若這個服務器上原本就跑着一個非常復雜的系統,本來系統的性能,數據庫的壓力就很大了,再加一個應用上去,那就很可能服務器更容易崩潰了。接着服務器可能會進入惡性循環每個服務都超時,程序的穩定性也面臨一大堆性能導致的嚴峻問題。
100 * 8 * 60 * 2 * 20 = 192 0000 , 很可能由於程序寫的性能不太好,硬盤的壽命也受到影響,本來可以用8年的硬盤5年就掛了,讀寫太頻繁了,哈哈
所以在不追加硬件投資的前提下就需要不斷優化程序的運行性能,電腦硬件的貶值速度大家都懂的,今年購買個10萬的硬件服務器,明年你想5萬賣出都很難了,很可能3年后就是廢銅爛鐵一大堆了,當然這也不是絕對的,只是打了個比喻。
下面我們通過一個選項表的緩存處理效果
.Web 可以理解為專門為Web項目優化的代碼部分
程序里用到了Linq,Cach
下面是緩存優化的代碼,歡迎高手點評,有錯就改,不能當太固執的開發人員,程序員大多倔強得很
//----------------------------------------------------------------- // All Rights Reserved , Copyright (C) 2012 , Hairihan TECH, Ltd. //----------------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Caching; namespace DotNet.Business { using DotNet.Utilities; /// <remarks> /// BaseItemDetailsManager /// 選項管理 /// /// 修改紀錄 /// /// 版本:1.0 2012.12.13 JiRiGaLa 選項管理從緩存讀取,通過編號顯示名稱的函數完善。 /// /// 版本:1.0 /// <author> /// <name>JiRiGaLa</name> /// <date>2012.12.13</date> /// </author> /// </remarks> public partial class BaseItemDetailsManager { #region private static List<BaseItemDetailsEntity> GetEntityList(string tableName) 獲取選項表明細,從緩存讀取 /// <summary> /// 獲取選項表明細,從緩存讀取 /// </summary> private static List<BaseItemDetailsEntity> GetEntityList(string tableName) { if (HttpContext.Current.Session == null || HttpContext.Current.Cache[tableName] == null) { lock (BaseSystemInfo.UserLock) { if (HttpContext.Current.Session == null || HttpContext.Current.Cache[tableName] == null) { // 讀取目標表中的數據 List<BaseItemDetailsEntity> entityList = null; BaseItemDetailsManager itemDetailsManager = new DotNet.Business.BaseItemDetailsManager(tableName); entityList = itemDetailsManager.GetList<BaseItemDetailsEntity>(); // 這個是沒寫過期時間的方法 // HttpContext.Current.Cache[tableName] = entityList; // 設置過期時間為8個小時,第2天若有不正常的自動就可以正常了 HttpContext.Current.Cache.Add(tableName, entityList, null, DateTime.Now.AddHours(8), TimeSpan.Zero, CacheItemPriority.Normal, null); } } } return HttpContext.Current.Cache[tableName] as List<BaseItemDetailsEntity>; } #endregion #region public static string GetItemName(string tableName, string itemCode) 通過編號獲取選項的顯示內容 /// <summary> /// 通過編號獲取選項的顯示內容 /// 這里是進行了內存緩存處理,減少數據庫的I/O處理,提高程序的運行性能, /// 若有數據修改過,重新啟動一下程序就可以了,這些基礎數據也不是天天修改來修改去的, /// 所以沒必要過度擔憂,當然有需要時也可以寫個刷新緩存的程序 /// </summary> /// <param name="tableName">選項表名</param> /// <param name="itemCode">選項編號</param> /// <returns>顯示值</returns> public static string GetItemName(string tableName, string itemCode) { string returnValue = itemCode; if (!string.IsNullOrEmpty(itemCode)) { List<BaseItemDetailsEntity> entityList = GetEntityList(tableName); BaseItemDetailsEntity itemDetailsEntity = entityList.FirstOrDefault(entity => !string.IsNullOrEmpty(entity.ItemCode) && entity.ItemCode.Equals(itemCode)); if (itemDetailsEntity != null) { returnValue = itemDetailsEntity.ItemName; } } return returnValue; } #endregion } }
這個是在Web里調用的方法
這個是具體的編碼表里的存儲結構,例如我們數據庫里保存了1, 頁面上展示的是 “一級”。
雖然上面的程序都非常簡單,但是把以前龐大的系統,想怎么優化就怎么優化,想怎么改進就怎么改進,還是需要一定的思路,如何架構系統更簡單,如何才能別人更容易看懂我們的系統源碼,可以在最短的時間里能靈活模仿掌握,這也很頭痛的事情,畢竟系統架構太復雜了,學習掌握太困難了,如何才能方便大批量生產,又簡單又好用。
其實誰都不想跟自己過不去越簡單越好,都想早點兒回家陪陪家人,陪陪老婆婆孩子,過個真正的和諧生活,快樂家庭生活。
周末了大家都工作累了,來個美女圖欣賞一下。