緩衝技術及在Rainbow Portal的應用

來源:互聯網
上載者:User
緩衝

  1. ASP.NET緩衝技術概述

  將資料庫中的資料緩衝到記憶體(也可以儲存在其他場所),則無需在請求每個頁面時都訪問資料庫。由於從記憶體中返回資料的速度始終比新提供的資料速度快,因而可以大大提高應用程式的效能。

  ASP.NET為你使用緩衝技術提供最大的靈活性,你可以緩衝整個HTML頁面,或是部分HTML頁面,或是各種對象。你可以設定到期策略,或是設定依賴性,即在其他資源如檔案或資料庫表改變時,自動移出緩衝。

  ASP.NET中有兩種基本的緩衝:

  輸出緩衝

  網頁輸出快取是最為簡單的緩衝機制,該機制將整個ASP.NET頁面內容儲存在伺服器記憶體中。當使用者請求該頁面時,系統從記憶體中輸出相關資料,直到快取資料到期。在這個過程中,緩衝內容直接發送給使用者,而不必再次經過頁面處理生命週期。通常情況下,網頁輸出快取對於那些包含不需要經常修改內容的,但需要大量處理才能編譯完成的頁面特別有用。需要注意的是,網頁輸出快取是將頁面全部內容都儲存在記憶體中,並用於完成用戶端請求。

  可以通過在Web.config進行配置,設定緩衝策略,在一組ASP.net頁面中使用。還可以通過HttpCachePolicy類編程性設定頁面緩衝。

  資料緩衝

  應用程式資料緩衝提供了一種編程方式,可通過鍵/值對將任意資料存放區在記憶體中。使用應用程式緩衝與使用應用程式狀態類似。但是,與應用程式狀態不同的是,應用程式資料緩衝中的資料是易失的,即資料並不是在整個應用程式生命週期中都儲存在記憶體中。應用程式資料緩衝的優點是由ASP.NET管理緩衝,它會在項到期、無效,或記憶體不足時移除緩衝中的項,還可以配置應用程式緩衝,以便在移除項時通知應用程式。

  同時還有兩種特殊的緩衝,基於以上的緩衝模型:

  部分緩衝

  部分緩衝本質上是輸出緩衝。顧名思義,頁面部分緩衝是將頁面部分內容儲存在記憶體中以便響應使用者請求,而頁面其他部分內容則為動態內容。頁面部分緩衝的實現包括兩種方式:控制項緩衝和替換後緩衝。前者也可稱為片段快取,這種方式允許將需要緩衝的資訊包含在一個使用者控制項內,然後,將該使用者控制項標記為可快取的,以此來快取頁面面輸出的部分內容。這一方式緩衝了頁面中的特定內容,而沒有緩衝整個頁面,因此,每次都需重新建立整個頁。例如,如果要建立一個顯示大量動態內容(如股票資訊)的頁,其中有些部分為靜態內容(如每周總結),這時可以將靜態部分放在使用者控制項中,並允許緩衝這些內容。緩衝後替換與控制項緩衝正好相反。這種方式緩衝整個頁,但頁中的各段都是動態。例如,如果要建立一個在規定時間段內為靜態頁,則可以將整個頁設定為進行緩衝。如果向頁添加一個顯示使用者名稱的Label控制項,則對於每次頁重新整理和每個使用者而言,Label的內容都將保持不變,始終顯示緩衝該頁之前請求該頁的使用者的姓名。使用緩衝後替換機制,可以將頁配置為進行緩衝,將頁的個別部分標記為不可緩衝。在此情況下,可以向不可緩衝部分添加Label控制項,這樣將為每個使用者和每次頁請求動態建立這些控制項。

  資料來源緩衝

  資料來源緩衝是指在資料來源控制項如SqlDataSource, ObjectDataSource, and XmlDataSource中快取資料,實際上是資料緩衝,只不過緩衝由控制項內部實現。

  緩衝依賴

  緩衝依賴允許快取項目依賴於另外一個資源,這樣資源變化時,快取項目自動移出。

  ASP.NET包括3種依賴類型

  依賴於其他快取項目

  依賴於檔案或檔案夾

  依賴於資料庫查詢。

  另外你還可以使用彙總依賴,或是自訂緩衝依賴。

  緩衝功能也有其自身的不足。例如,顯示的內容可能不是最新、最準確的,為此,必須設定合適的緩衝策略。緩衝增加了系統的複雜性並使其難於測試和調試,你設定的斷點、監控變數等由於緩衝在調試時都可能無效。

  2. Rainbow Portal中的資料緩衝

  Rainbow Portal的Portal、頁面、模組的配置資訊、頁面配置、主題等資訊全部儲存到資料庫裡,若是每次從資料據庫讀取,就會影響效能。Rainbow自此處理上使用了資料緩衝技術。

  兩個輔助類:

  Rainbow.Framework.Settings.Cache.Key 實現緩衝鍵名的擷取,其方法都是靜態。由於Rainbow一個網站可以包含多個Portal,每個Portal都有獨立的設定,因此緩衝的鍵名要區分不同的Portal。Key類為鍵名每個加上Portal的別名作為首碼。

  如擷取Portal配置資訊的鍵名:

  public static string PortalSettings()
  {
  return string.Concat(Portal.UniqueID, "_PortalSettings");
  }
  Rainbow.Framework.Settings.Cache.CurrentCache類封裝對當前緩衝的操作。
  Rainbow.Framework.Site.Configuration命名空間中的PortalSettings類,PageSettings類,ModuleSettings類;Rainbow.Framework.Design命名空間中的LayoutManager類,ThemeManager類等,都應用了緩衝技術。一般過程為:先判斷當前的Cache裡有沒有緩衝值,若有則從緩衝中直接讀取,若沒有就從資料庫中讀取,然後儲存到當前緩衝中。
  以PortalSettings類為例說明:
  public class PortalSettings
  {
  ......
  public static Hashtable GetPortalBaseSettings(string PortalPath)
  {
  Hashtable _baseSettings;
  if (!CurrentCache.Exists(Key.PortalBaseSettings()))
  {
  //從資料庫裡讀取
  ......
  儲存到緩衝中
  CacheDependency settingDependencies =
  new CacheDependency(
  new string[]
  {
  LayoutManager.Path,
  layoutManager.PortalLayoutPath,
  ThemeManager.Path,
  themeManager.PortalThemePath
  });
  using (settingDependencies)
  {
  CurrentCache.Insert(Key.PortalBaseSettings(), _baseSettings, settingDependencies);
  }
  }
  else
  {
  _baseSettings = (Hashtable)CurrentCache.Get(Key.PortalBaseSettings());
  }
  return _baseSettings;
  }
  }  針對緩衝移除的問題,Rainbow一方面採用了緩衝依賴自動移除,如上述代碼中的settingDependencies,另外一方面在程式中顯式移出,如在PortalSettings類中,當更改Portal配置後,就移除緩衝:

  public static void UpdatePortalSetting(int portalID, string key, string value)
  {
  //更新
  ....
  CurrentCache.Remove(Key.PortalSettings());
  }  Rainbow Portal的一些模組中,也用到了緩衝技術,但有些存在一定問題,如WhosLoggedOn模組中也使用了資料緩衝,但是並沒有通過Rainbow.Framework.Settings.Cache.Key類實現緩衝鍵名的擷取,這樣在一個網站存在多個Portal的時候,網站的統計數會出現不正確的情況。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。