【ASP.NET 系列】淺談緩存技術在ASP.NET中的運用
本篇文章雖不談架構,但是Cache又是架構中不可或缺的部分,因此,在講解Cache的同時,將會提及到部分架構知識,關於架構部分,讀者可以不用理解,或者直接跳過涉及架構部分的內容,
你只需關心Cache即可,具體的架構,會在後續文章中與大家分享,如果你感興趣,只需關註即可。
一 為什麽要在ASP.NET 項目中引入緩存
1. 我們先來考慮一個問題,通常,面臨高並發問題時,我們應該怎麽處理?
下圖為常規的處理思路和方法
2.為什麽引入Cache呢?
我們知道,造成高並發的根本原因是大量讀寫的問題,一般地,對於一個系統,讀總是比寫多,如我們總是逛淘寶,京東,天貓,唯品會等,但我們並不一定買東西(買東西,即下單,下單的操作,對應DB的Write操作),
緩存主要解決都的問題(當然,在後期的文章中,我會講到消息隊列MQ,也是一種緩存機制,其不僅僅解決都得問題,還解決寫的問題)。
很好,我們知道緩存主要解決都得問題,那麽,我們都得東西很多,是不是緩存所有都得內容呢?答案是否定的。緩存主要解決那些高頻訪問,吃服務器資源,實時性要求比較低,不常更新的內容。
二 ASP.NET 緩存技術概述
(一)ASP.NET緩存技術種類
在ASP.NET實際項目開發中,我們可以采取基本的三種緩存技術:頁面緩存、局部頁面和數據緩存
1.整頁緩存
所謂整頁緩存,指緩存整個頁面,且設置刷新間隔時間,刷新間隔時間一般以秒為單位(緩存不能全部刷新,且刷新間隔不依賴外部事件);
2.部分頁面緩存
所謂部分頁面緩存,也叫局部頁面緩存,指通過設定影響頁面的參數,此時的緩存存儲頁面的多個版本,一般情況需要按照參數值為這些頁面版本設置索引;
3.運用程序緩存
所謂運用程序緩存,也叫數據緩存,指將需要大量服務器資源的對象存儲在內存中,在ASP.NET中,由Cache類來實現(Cache類的每個實例對應具體的每個運用程序,
其生存期依賴於運用程序的生存期,當然,如果系統重啟或者斷電,則另當別論。)
(二)二級緩存技術
在ASP.NET一般的項目中,我們采用二級緩存就可以解決服務器緩存問題了,如下為二級緩存的輪廓圖。
1.何為一級緩存?
一級緩存,指不借助於外部緩存的緩存,上圖中的二級緩存去掉外部緩存部分即為一級緩存;
2.組成:由Web服務器、數據庫服務器和二級緩存系統構成;
3.請求-處理流程:對於都數據,采用從內向外的順序:內部緩存=》外部緩存=》數據庫
(1)首次請求讀數據:藍色的箭頭表示首次請求,從數據庫服務器DB中取得數據,並將數據緩存在二級緩存系統中;
(2)非首次請求讀數據:先從二級緩存內部緩存中取數據顯示頁面,如果沒有數據,則去二級緩存外部緩存中取數據顯示頁面,若外部緩存中沒有數據,則再去數據庫服務器中取數據;
(4)對於寫數據,才有從外向內順序:數據庫=》外部緩存=》內部緩存(這樣做的目的,主要是維護數據的一致性);
4.構成二級緩存系統的外部緩存系統,一般我們可選擇MongoDB,Redis,Mencached等;
5.基於SOA+Redis的的一般系統架構(當然,本片文章不談架構,因此不會分析架構,但會在後續的文章中單獨講解架構)
6.如何保證數據的一致性?
對於讀數據,采用從內向外的順序;對於寫數據,采用從外向內的順序;
7.緩存的有效期?
我們以Memcached做外部緩存為例,我對於ASP.NET內部緩存,我們會擔心內存不夠用,而對於Memcached,則可以不用擔心內存不夠用的問題。
采用二級緩存方案,Memcaches緩存與ASP.NET緩存都要進行嚴格的管理和控制,因為Memcached工作在外層,直接對數據庫中的數據進行讀取,
且他的內存空間一般較大,故它的緩存數據有效期應該根據緩存數據在運用中的實際緩存有效期來設定,不會受到內部不足而被釋放的影響,而ASP.NET
緩存工作在內層,直接與運用程序中的數據進行交互,且ASP.NET框架對自身緩存的內存空間有所限制,緩存空間過大會影響整個運用的性能,為了在
相同的內存空間下緩存更多的數據,ASP.NET緩存的有效期應該小於或等於Memcached緩存的有效期,有效期具體多長時間視內存空間和運用程序訪問
頻率的高低而定,ASP.NET對同意緩存數據的有效期之和不能大於其在Memcached中的有效期,這樣才能達到緩存數據的一致性,兩個緩存的協同工作
,可以對運用程序的訪問速度帶啦很大的提升。
(三)緩存涉及到的一些相關技術
緩存是一門技術,不可能花較少的篇幅即可講明白,如下簡要列舉一些Cache相關的技術
1.Cahe維護
維護網絡上的,本地的Cache;
2.路由策略
具體的路由策略要根據Cache架構和設計來設定,大致講解一下本地緩存路由策略
3.替換算法
略
4.預取技術
略
5.Cache性能分析
借助一些性能分析工具來分析,主要關註命中率/緩存對象大小之間關系
6.過期策略
合理設置過期間隙,一般以秒為單位;
7.數據一致性
保證主從同步,讀寫數據的順序等;
8.緩存級別
具體的級別,根據具體的業務需求來設定;
9.Cache技術
磁盤緩存,存儲器緩存,WWW服務器緩存等;
10.數據緩存技術
客戶端數據緩存,分布式數據緩存,集中式數據緩存等;
三 Cache在ASP.NET MVC中的運用
(一)整頁緩存
1.ASP.NET MVC中有哪些整頁緩存?
整頁緩存是一種比較簡單且常用的緩存方式,緩存這個頁面。在ASP.NET中,整頁緩存一般包括控制器緩存,Action緩存,Web.config緩存等;
2.哪些頁面需要整頁緩存?
一般地,整頁緩存頁面具有“讀取頻繁,數據不常更新、編譯時需要占用大量時間和資源”等特點;
3.ASP.NET MVC中整頁緩存的語法格式
4.例子
(1)控制器緩存
控制器緩存指把緩存作用於控制器。
PageCacheController.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespace CacheDemo.Controllers 8 { 9 [OutputCache(Duration = 70)] 10 public class ControllerCacheController : Controller 11 { 12 // GET: Default 13 public ActionResult ControllerCache() 14 { 15 16 ViewBag.CurrentTime = System.DateTime.Now; 17 return View(); 18 } 19 } 20 } 21
PageCache.cshtml
1 @{ 2 ViewBag.Title = "ControllerCache"; 3 } 4 5 <h2>ControllerCache</h2> 6 7 <div> 8 ViewBag的值:@ViewBag.CurrentTime 9 </div>
Result:
(2)Action緩存
Action緩存指把緩存作用於Action。控制方法緩存與控制器緩存原理差不多,只不過控制器緩存把緩存作用於控制器,控制器方法緩存把緩存作用於控制器方法。這裏就不講解了。
(3)Web.config緩存
Web.config緩存,有點類似於我們將數據庫連接字符串添加在配置文件一樣,看看下面的代碼,是否很熟悉呢?
<connectionStrings> <add name="SqlserverConstr" connectionString="Server=IP;db=DataBaseName;uid=UserName;pwd=Password" providerName="System.Data.SqlClient" /> </connectionStrings>
Web.config將需要緩存的Controller或Action提取抽象到配置文件中,其實就相當於我們使用數據庫連接字符串,使用時,調用即可。
<system.web> <caching> <outputCacheSettings> <outputCacheProfiles> <add name ="WebConfiCache" duration="70"/> </outputCacheProfiles> </outputCacheSettings> </caching> <compilation debug="true" targetFramework="4.6.1" /> <httpRuntime targetFramework="4.6.1" /> </system.web>
我們將上面的控制器緩存參數用Web.config來配置
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespace CacheDemo.Controllers 8 { 9 //[OutputCache(Duration = 70)] 10 [OutputCache(CacheProfile = "WebConfiCache")] 11 public class ControllerCacheController : Controller 12 { 13 // GET: Default 14 public ActionResult ControllerCache() 15 { 16 ViewBag.CurrentTime = System.DateTime.Now; 17 return View(); 18 } 19 } 20 } 21
分析:
其實相當簡單,就當作數據庫連接字符串來操作或者<appSetting>操作即可
(3)緩存依賴
留給讀者朋友們去研究,比較簡單。
(二)部分頁面緩存
部分頁面緩存,也叫頁面部分緩存,主要解決在頁面緩存中需要經常實時更新的一部分內容。
頁面部分緩存就是緩存頁面的一部分,而不是緩存整個頁面,它適用於頁面內某些部分可能需要更新的數據的情況,在常用頁面部分緩存的技術下經常采用先將整個頁面緩存,然後再替換頁面中不需要緩存的部分。(用AJAX局部刷新來理解)
(三)運用程序緩存
運用程序緩存是用來存儲與運用程序有關的對象,主要由Cache類來實現(命名空間System.Web.Caching),可以以編碼的方式靈活地控制緩存的操作。
四 版權區
- 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
- 博主網址:http://www.cnblogs.com/wangjiming/。
- 極少部分文章利用讀書、參考、引用、抄襲、復制和粘貼等多種方式整合而成的,大部分為原創。
- 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]。
- 可以轉載該博客,但必須著名博客來源。
【ASP.NET 系列】淺談緩存技術在ASP.NET中的運用