2012-05-01 171 views
3

我正在編寫一個控件,顯示頁面上的項目列表。數據庫包含(可說)與1000頁(可說)相關(多對多)的50,000個項目。緩存大量對象的方法(ASP.NET緩存vs靜態對象和單獨緩存對象vs字典)

而不是編寫一個存儲過程來從數據庫返回給定頁面的一組完整項目(即所有列,爲了水合項目對象列表),我正在考慮執行以下操作來呈現一個清單:

  • 在應用程序啓動時,緩存所有上市項目
  • 獲得SP爲項目
  • 通過按鍵&從緩存中檢索匹配對象的列表循環只返回鍵值

初步測試表明,這比從每個頁面請求的數據庫中提供列表執行得更快。由於每個頁面請求只查找現有對象,而不是每個請求都創建一個私有列表(當流量很高,請求大頁面時內存消耗非常高),它似乎也會減少整體內存消耗。

所以現在我正在與其他開發人員討論如何實現緩存。我們已經想出了幾個選項,而這正是我將不勝感激您的意見:

  • 使用ASP.NET HttpContext.Current.Cache
  • 使用靜態/單身對象

在每個這些也有一個選擇是否:每個項目對象

  1. 緩存單獨
  2. 構建字典(或類似的立st)包含所有項目對象,然後緩存字典

讀取性能是主要關心的問題。維護是次要的問題 - 我們將防禦地編寫我們的GetItems方法來檢查每個項目是否在緩存中,如果沒有,從數據庫中檢索它並將其插入到緩存中。

我知道有沒有正確的答案......有利弊&缺點的一切。我只是想看看人們是否有可以分享上述任何一個方面的缺陷,或者如果任何方法突出表現爲迄今爲止表現最好的,或者特別難以合併新數據。

謝謝

+1

+1:好問題。 –

回答

2

我會去緩存的方法。其中一些原因如下:

  1. 您可以控制在釋放內存之前對象將保存在緩存中的時間。在重負載的情況下,這可能會讓服務器響應得更好。
  2. 如果值得付出努力,我甚至可能會走得更遠,並使用某種分佈式緩存,以便在應用程序池回收中倖存下來。想到了MemcacheNCache

我不喜歡Singleton方法。在我看來,當你可以完美地使用Cache時,你會重新發明輪子。併發性將成爲緩存問題,您將失去使用分佈式緩存的靈活性。無論採取什麼方法,我都會創建一個包裝類來存儲和從緩存中檢索對象,這將允許您在將來無縫地從傳統緩存更改爲分佈式緩存。

+0

謝謝。這很有道理。 – Laurence