2013-11-28 189 views
0

場景:ASP.Net服務器側數據緩存

實現在內存中的ASP.Net應用程序的web場方案

    的WCF層的主數據的高速緩存
  1. 數據在第一次訪問服務層時緩存,比如GetCountryList()方法的緩存'過期設置爲午夜。比方說,緩存鍵是「CountryList_Cache」
  2. 隨後的所有請求都通過緩存」
  3. 擔任如果國家列表中使用主屏幕更新,那麼額外的調用,以無效‘CountryList_Cache’和新鮮的數據加載到它
  4. 下一個電話現在收到更新的國家列表 上述步驟在單個服務器方案中很容易,因爲步驟3只需要一個服務器的緩存過期呼叫。當我們有2個或3個負載均衡的Web服務器時,複雜度會增加,因爲在這種情況下,緩存僅通過一臺服務器更新(通過主屏幕),但必須在所有3臺服務器上失效。

我們提出的解決方案:

我們打算有一個外部服務/ EXE /網頁這將是瞭解所有負載均衡服務器(通過配置文件)。爲了使特定的緩存失效,我們將調用這個外部組件,而這個外部組件又會使所有Web服務器上的相應緩存鍵無效,然後使用最新數據加載緩存。

問題:

雖然上述方法將爲我們工作,我們不認爲這是一個企業級的LOB應用程序乾淨的方法。是否有更好/更乾淨的方式來實現跨多個服務器的緩存過期?

注:

  1. 我們不希望使用分佈式緩存,由於明顯的性能損失,相比於進程內/內存緩存
  2. 緩存一直使用System.Runtime實現。緩存
  3. 我們已經與SQL依賴工作,在單個Web服務器

回答

1

您的設計相較於Windows Azure的角色內Cache和AppFabric的緩存的場景中使用它。

在這些產品中,緩存存儲在一個或多個服務器(緩存集羣)中。爲了加快請求速度,他們創建了Local Cache

當啓用本地緩存時,緩存客戶端在本地存儲對對象 的引用。該本地引用使對象在客戶端應用程序的內存中保持活動狀態 。當應用程序請求 該對象時,緩存客戶端會檢查該對象是否駐留在本地緩存的 中。如果是,則立即返回 而不與服務器聯繫。如果它不存在,則從服務器檢索 對象。然後,緩存客戶端 對對象進行反序列化,並將對這個新近檢索到的對象的引用存儲在本地緩存中。客戶端應用程序使用這個 相同的對象。

本地緩存可以通過超時和/或通知將失效

Notification-based Invalidation

當您使用緩存通知,您的應用程序檢查與定期間隔 緩存集羣看看是否有新的通知 可用。這個間隔稱爲輪詢間隔,默認情況下每隔012秒鐘就會有300秒。輪詢間隔在應用程序配置設置中以 秒爲單位指定。請注意,即使使用基於通知的失效 ,超時仍然適用於 本地緩存中的項目。這使基於通知的失效互補 超時失效。