2009-01-29 84 views
11

應該將站點的動態業務對象存儲在用戶會話中還是使用ASP.Net緩存(對象,如訂單,配置文件信息等)?ASP.Net中的數據緩存vs會話對象

我曾與使用會話來存儲業務對象的網站,但我想知道...什麼是緩存的優點或缺點?

回答

23

如果對象可在用戶會話之間共享,請使用緩存。如果這些對象對於每個會話都是唯一的 - 也許是因爲它們受到權限控制 - 然後將其存儲在會話中。進程內會話本身存儲在緩存中,所以決定因素應該是數據的範圍。

+4

另一個考慮因素是緩存數據生命週期所需的控制級別和粒度。會話基於全局會話狀態超時期限制您到滑動到期策略。直接使用緩存可爲您提供對這些參數的額外控制。 – 2010-02-16 00:52:31

2

ASP.NET系統緩存對應用程序是全局的,因爲會話對當前用戶是唯一的。如果您選擇使用全局緩存來存儲對象,則需要創建對象識別策略,以便爲每個用戶獲取正確的對象。

如果您希望提高性能,最好使用分佈式內存緩存(例如Microsoft的速度)替換ASP.NET會話狀態。微軟公佈了關於如何將會話使用替換爲目標Velocity的文章。您也可以以相關方式使用Memcache或其他類似產品。

2

會話對象適用於用戶專用數據,另一方面,高速緩存對象更適合應用程序共享的數據。
保存在一個或另一箇中的關鍵是確定您嘗試存儲的內容是用戶唯一的數據還是需要在所有應用程序中共享。

Session =>具有逐步界面的網頁(例如在線測試)。
緩存=>在某種天氣小部件中顯示的信息(例如Google在其igoogle.com頁面中顯示的信息)。
希望這會有所幫助。

6

緩存就是這樣 - 緩存。你永遠不能依賴於那裏的條目,所以在這方面不需要做任何假設:準備直接訪問數據庫(或其他任何地方)重新獲取數據。

另一方面,會話更適合存儲對象,儘管我個人嘗試避免使用會話存儲來支持數據庫。我通常做的是通過抽象掉商店不透明ISessionStoreService接口後面:

interface ISessionStore 
{ 
    T GetEntry<T>(string key); 
    void SaveEntry<T>(string key, T entry); 
} 

,然後「依賴注入」適當的執行,無論是InmemorySessionStoreDbSessionStore或什麼的。

1

雖然您可以將業務對象存儲在緩存中,但緩存旨在提高性能而不是狀態管理。想象一下,你有一個從數據庫獲得1000條記錄的過程(大約需要3秒),你需要幾分鐘。您可以將對象存儲在緩存中,並設置過期日期,優先級和依賴關係(如SqlDependency或FileDependency),因此對於下一次請求,您可以使用緩存數據,而不是從數據庫中進行回溯。您可以將對象存儲在Session中,但默認情況下無法爲Session設置依賴關係。此外,緩存具有獨特的行爲,當系統需要內存時,它將根據緩存的優先級從緩存釋放對象。緩存對象對應用程序是全局的,並在所有用戶之間共享,但會話不共享,並且可用於每個用戶(會話)。