最近在進行 YbSoftwareFactory 的流程功能升級,目前已經基本完成,現將用到的一些關於 Web Api 及 MVC 性能提升的一些小技巧進行了總結,這些技巧在使用、配置上也相當的簡單,但通常都能大大提高應用程序的性能,希望對大家有用。
一、緩存
為了避免每次請求都去訪問后台的資源,我們一般會考慮將一些更新不是很頻繁的,可以重用的數據,通過一定的方式臨時地保存起來,后續的請求根據情況可以直接訪問這些保存起來的數據,這種機制就是所謂的緩存機制。緩存分為頁面輸出緩存,內存數據緩存和緩存依賴等。從設計原則來說,易變性、敏感性的信息不適合進行緩存,同時緩存的內容也是易丟失的,在代碼中不能完全依賴於緩存的數據,需要保證在緩存的數據丟失后也能進行正確的處理。
1、頁面輸出緩存
通過對輸出的頁面進行緩存,每次新的用戶請求調用相同的 Action 時,相同的內容不需要重新創建一次而直接輸出。頁面輸出緩存的使用非常簡單,在 Action 上使用 [OutputCache] 特性標記即可生效。頁面輸出緩存可控制緩存的內容所存儲的位置,例如是在服務器端存儲緩存的頁面內容還是在客戶端存儲緩存的頁面內容;也可使用 Duration 參數控制緩存的失效絕對時間和間隔時間,甚至能使用 VaryByParam 參數對不同的請求參數分別進行緩存。頁面輸出緩存非常適合於內容比較固定的前端頁面的緩存。
2、內存數據緩存
通常情況下,數據是保存在數據庫、磁盤文件等存儲介質中的,而應用程序訪問這些資源是一項很費時的操作。如果先將這些資源中的數據緩存到內存緩存區中,當應用程序需要這些數據時,直接從緩存區中提取,就可以減少系統開銷,顯著提高可使用的用戶並發數等。內存數據緩存需考慮緩存的內容更改失效后如何清空其他已經被緩存的相關聯的數據問題。
3、EFCache
眾所周知,NHiberate 提供了二級緩存功能。現在,如果你使用的是 Entity Framework 6 或更高版本的 Entity Framework ,你也可考慮使用 EFCache 組件來為 Entity Framework 提供二級緩存支持,其實質上也是屬於內存數據緩存。EFCache 的特點是使用上非常方便,僅需定義如下的代碼無需其他復雜的額外的配置即可實現二級緩存。如需定義特定的緩存策略,如緩存的過期時間,控制數據緩存的范圍,也僅需繼承 CachingPolicy 類並 override 其部分方法即可。你甚至可以通過實現 ICache 接口來實現自定義的緩存模型以替換默認的 InMemoryCache 。
經測試,使用 EFCache 后,通常性能的提升均是顯而易見的。其參考代碼如下:
1 /// <summary> 2 /// EF二級緩存配置,如無需二級緩存請注釋如下類定義 3 /// </summary> 4 public class Configuration : DbConfiguration 5 { 6 private static InMemoryCache _cache = new InMemoryCache(); 7 public Configuration() 8 { 9 var transactionHandler = new CacheTransactionHandler(_cache); 10 11 AddInterceptor(transactionHandler); 12 13 var cachingPolicy = new CachingPolicy(); 14 15 Loaded += 16 (sender, args) => args.ReplaceService<DbProviderServices>( 17 (s, _) => new CachingProviderServices(s, transactionHandler, 18 cachingPolicy)); 19 } 20 public static void ClearCache() 21 { 22 _cache.Purge(); 23 } 24 }
二、Stream壓縮
對響應流進行壓縮,其作用是減少網絡開銷,提高系統的響應速度。目前的瀏覽器通常都支持 gzip 和 deflate 壓縮解壓功能,因此你通常無效考慮瀏覽器的兼容性問題。啟用 gzip 和 deflate ,既可通過 IIS 配置實現,在 MVC 中也可通過編寫自定義的 ActionFilter 實現。在壓縮之前和壓縮之后 Stream 的大小差異通常都是驚人的,其壓縮率通常都在5-10倍以上。
具體可看看如下的監視數據:
三、js和css文件的壓縮和打包
1、js 和 css 文件的壓縮
其實質就是生成較小的文件,減小下載這些文件的網絡開銷,提供系統的響應速度。壓縮 js 和 css 文件還有個好處是通常還可以起到代碼混淆的作用。在 YbSoftwareFactory 的 MVC 解決方案中,使用的是 Microsoft Ajax Minifier 組件,可在代碼編譯的過程中自動對所配置的 js 和 css 進行壓縮,基本上文件的大小都可減少一半以上:
在 YbSoftwareFactory 的 MVC 解決方案中,巧妙使用了條件編譯符號,可在 Debug 模式下使用未壓縮的版本以方便調試,在 Release 模式下則可自動切換至對已壓縮文件的引用,並通過 Microsoft Ajax Minifier 生成最新的被壓縮后的文件版本,對於程序的開發和部署均非常的方便,例如下面的代碼:
1 @{ 2 ViewBag.Title = "產品"; 3 ViewBag.AllowEdit = true; 4 ViewBag.AdminJsUrl = YbRapidSolution.Mvc.AutofacBootStrapper.RELEASE 5 ? @Url.Content("~/Scripts/Admin/Products/Index.min.js") 6 : @Url.Content("~/Scripts/Admin/Products/Index.js"); 7 var commonJs = YbRapidSolution.Mvc.AutofacBootStrapper.RELEASE 8 ? @Url.Content("~/Scripts/Admin/Products/_Common.min.js") 9 : @Url.Content("~/Scripts/Admin/Products/_Common.js"); 10 }
2、js、css文件的打包
其目的是進行 js 文件和 css 文件的合並,當前主流瀏覽器的並發連接數默認情況下通常都是 6 個,如果前端頁面同時請求的服務器資源(如 img 文件、js 文件、css 文件以及各類 url 請求等)超過6個,通常就需要進行排隊下載。進行 js 文件、css 文件的打包合並,通常可以在一次請求中就完成未打包之前需多次請求才能完成的工作,通過減少前端瀏覽器的連接請求,在某種意義上也是可提高系統的響應速度的。js、css 文件的打包通常可以使用 MVC 自帶的 Bundle 功能,也可使用某些專用的打包工具,具體不再詳細描述。
如需了解更多請點擊:權限模型+流程專家 Demo