
本篇文章雖不談架構,但是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]。
- 可以轉載該部落格,但必須著名部落格來源。