淺談緩存技術在ASP.NET中的運用

本篇文章雖不談架構,可是Cache又是架構中不可或缺的部分,所以,在講解Cache的同時,將會說起到部分架構知識,關於架構部分,讀者能夠不用理解,或者直接跳過,html

你只需關心Cache便可,具體的架構,會在後續文章中與你們分享。web

一   爲何要在ASP.NET 項目中引入緩存算法

1. 咱們先來考慮一個問題,一般,面臨高併發問題時,咱們應該怎麼處理?數據庫

下圖爲常規的處理思路和方法緩存

 

2.爲何引入Cache呢?服務器

        咱們知道,形成高併發的根本緣由是大量讀寫的問題,通常地,對於一個系統,讀老是比寫多,如咱們老是逛淘寶,京東,天貓,惟品會等,但咱們並不必定買東西(買東西,即下單,下單的操做,對應DB的Write操做),緩存主要解決讀的問題(固然,在後期的文章中,我會講到消息隊列MQ,也是一種緩存機制,其不只僅解決讀的問題,還解決寫的問題)。網絡

        很好,咱們知道緩存主要解決讀的問題,那麼,咱們讀的東西不少,是否是緩存全部讀的內容呢?答案是否認的。緩存主要解決那些高頻訪問,吃服務器資源,實時性要求比較低,不常更新的內容。架構

二   ASP.NET 緩存技術概述併發

 (一)ASP.NET緩存技術種類app

在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/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分爲原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:2098469527@qq.com。
  • 能夠轉載該博客,但必須著名博客來源。
相關文章
相關標籤/搜索