2009-01-09 49 views
63

在會話vs緩存中存儲數據表有什麼區別?有什麼優點和缺點?緩存vs會話的優勢

因此,如果它是一個簡單的搜索頁面,它返回一個數據表格的結果並將其綁定到一個gridview。如果用戶'a'搜索和用戶'b'搜索,是否最好將它存儲在Session中,因爲每個用戶很可能有不同的結果,或者我仍然可以將每個搜索存儲在Cache中,或者這樣做沒有意義,因爲存在只有一個緩存。我想基本上我想說的是Cache會被覆蓋。

+0

你能緩存,你希望所有用戶在應用程序中使用的數據。歷史數據可能不會改變。例如,會話應該用於存儲用戶上下文的數據,如果其類似於緩存數據的過濾結果。 – ppumkin 2015-03-13 10:35:01

+2

***`HttpContext.Current.Cache vs HttpRuntime.Cache` ***? – Kiquenet 2015-08-05 12:07:48

+1

@Kiquenet我真的很佩服你的努力。 – ozgur 2016-04-01 17:10:17

回答

77

一個重要的區別是,緩存中的項目可能會在指定的時間後過期(將從緩存中刪除)。放入會話的項目將保留在那裏,直到會話結束。

當可用內存量變小時,ASP.NET還可以從緩存中刪除項目。

另一個區別:會話狀態可以保持在外部(狀態服務器,SQL服務器),並在Web應用程序的多個實例之間共享(用於負載平衡)。緩存並非如此。

除了這些差異(正如其他人所指出的):會話是每個用戶/會話,而緩存是每個應用程序。

27

AFAIK,關鍵的區別是會話是每個用戶,而緩存將用於應用程序範圍的項目。

正如其他答案中所述,您可以將每個用戶的信息存儲在緩存中,爲您提供密鑰(按會話或cookie)。然後你可以有更多的控制來使緩存中的項目過期,並且對它們設置依賴關係。因此,如果有問題的數據表會定期發生變化,那麼緩存可能是一個合適的選擇。否則,如果是靜態會話可能會更合適。 Steven Smith has an excellent video on caching at dnrtv值得一試。

這實際上取決於你想要達到的目標,你有多少時間。關於如何在應用程序中存儲狀態,還有其他一些備選方案需要考慮。 根據表格的大小,您可以考慮將狀態存儲在cookie中(如果它是敏感信息,則加密)。或者,如果它是應用程序範圍的數據,您可以在頁面或類上使用靜態字段。還有應用程序對象。

更新:我認爲你必須問自己的關鍵問題是誰應該看到這些數據。

Are they going to access the data frequently? 

(不,不要打擾)。

Is it going to change? 

(不,使用靜態字段或應用程序)。

Is it acceptable for user a and user b to see the same results? 

(不,使用包含用戶名和搜索項的鍵的緩存)。
(是的,使用搜索項的關鍵字使用緩存)。儘管如此,如果你在開發過程中距離不遠,我會考慮將緩存/狀態問題暫時擱置 - 你可能甚至不需要它。

性能調整的前三條規則是: 1.測量,2.測量更多。 3.再次測量...

5

緩存位於應用程序範圍內,目的是減少獲取一段數據的次數。會話在用戶的會話範圍內,目的是給出特定的用戶狀態。

5

那麼這取決於你如何爲ASP.NET配置會話。你是否將會話存儲在數據庫或內存中?如果在內存中使用單獨的服務器,或者您正在使用當前的網絡服務器進行會話?

根據您爲事情設置的方式,當您使用類似數據表的東西時,可能會影響性能,這告訴我您可能存儲了大量數據。

另外會話是按用戶存儲的,並且通過會話票據檢索每個用戶的會話票據,該會話票據存儲在會話Cookie或URL中(如果他們不接受Cookie並且您已將ASP.NET設置爲無Cookie模式。您緩存的任何內容都將緩存在應用程序級別,並可供所有用戶會話使用,可能會或可能不會。

3

會話是每個用戶,緩存是爲應用程序。

緩存中的項目可以並將根據IIS輔助進程的到期時間(滑動或固定)和內存限制自動刪除。

所以基本上Cache中的項目永遠不會保證存在,但Session將一直存在,直到會話結束。

以每個用戶爲基礎(通過會話或創造性地使用Cache)存儲項目可能導致大量內存使用情況,因此應仔細考慮。

最重要的是,如果IIS重置工作進程,則可能會丟失緩存和會話。

2

請參閱this answer

會話可能會導致應用程序性能下降,除非您使用一些後端提供程序(如memcached或速度)。一般你應該避免它。

8

的另一個重要區別,會話狀態將被阻止如果併發異步Ajax請求被執行時,它會影響性能