2009-08-05 109 views
3

您是否應該存儲每個請求所需的用戶信息 例如。角色,電子郵件,用戶名等在會話中存儲用戶信息?

在會話中,或者可以轉到數據庫每次請求這些信息?

謝謝

回答

0

我寧願爲此使用加密的cookie。數據庫調用在大型繁忙系統中可能會變得昂貴。會話沒問題,但是如果你的會話後端是數據庫驅動的,那也會變得很昂貴。顯然,使用cookie時,您必須合併驗證令牌檢查。

+0

驗證令牌檢查?你的意思只是形式auth的東西? – Schotime 2009-08-05 13:06:43

+0

當然,取決於您的需求! – grenade 2009-08-05 13:33:21

0

這取決於你的意思是「應該」。我已經開發了幾個使用會話來緩存用戶信息的應用程序。該方法運行良好,並減少了每個Web請求所需的數據庫往返次數。另一方面,它確實爲你的Web服務器引入了狀態,所以你必須堅持一個Web服務器,使用「病態會話」(這可以使管理Web服務器變得更復雜一些),或者開始存儲會話信息在一個共享的數據存儲中(這會消除你使用它的任何性能增益)。

0

會話數據也可以存儲在數據庫中,如果您的站點在Web Garden og Farm中運行,則該數據非常有用。如果會話正在運行InProc,則用戶數據將被保存在內存中,這樣做的速度要快得多,但代價是可擴展性。

另一種常見的方法是將其保存爲ViewState,然後在每次回發時在客戶端和服務器之間回傳第四次,這當然會導致帶寬命中,但是比InProc會話更好。

我個人喜歡會話狀態更好,如果網站很小我運行InProc,如果/當網站增長時,我可以改變它來使用數據庫。

3

如果您不打算進行負載均衡,那麼會話狀態是完全可以接受的。但是,如果會話狀態配置爲使用數據庫持久性,那麼請小心,因爲那樣您不僅會觸碰數據庫,還會產生對對象序列化的開銷。

如果它是用戶特定的數據,那麼分佈式散列表緩存系統可能會工作。諸如Memcached之類的東西對此很有幫助,因爲它們是內存中的高速緩存(性能),但分佈在多個服務器上(負載平衡),因此您可以獲得兩全其美的好處。

當然,如果數據定期發生變化,特別是如果其他系統可能在沒有Web應用程序知道的情況下修改數據庫,那麼返回數據庫可能是唯一的選擇。

+0

如果您使用的是memcache會話存儲,並且您知道正在修改的用戶數據,那麼如果會話密鑰以某種方式綁定到用戶(f.ex map sessionId - > userId),則始終可以使會話數據無效。這樣即使頻繁更改也可以使用會話存儲。 – Runeborg 2009-08-05 13:33:01

+0

是的,但重點是如果頻繁更改,避免(反)序列化開銷並轉到數據庫可能會更好。這需要進行性能測量,以瞭解哪種方法在負載下性能更好。 – 2009-08-05 22:14:25

0

我在會話中保留用戶標識,並將許多應用程序的活動用戶記錄保存在緩存中,但是我又傾向於將所有下拉列表的內容保留在緩存中,並且必須提供下拉列表的用戶。

我已經有很多人驚呼「你在Cache中保留這個!!??」但實際上,它效果很好。好,我有一個確切的高速緩存中的用戶列表中的副本不是每個應用實例一份(100個併發用戶是指在內存中的用戶列表中的潛在100份)。一般情況下,我會將任何在Cache中不經常更改的內容放在緩存中,如果緩存發生更改,則強制緩存,以便在下次訪問時重新加載。

0

這取決於您的網站/應用程序。一般的規則是這樣的:

會話保存作品好,如果併發用戶的數量是相當低,該數據相對較小。

如果同時存在的用戶數很多,並且數據的大小相對較低,則保存在cookie中會很有效。很明顯,cookies是公開可見的,所以如果它是敏感的,比如電子郵件,那麼它應該被加密。

如果數據的大小很大,保存在數據庫中效果很好。

注意。正如其他人所說,如果你使用網絡農場,那麼我會忘記保存在會話中。

Martin Fowler對「企業應用架構模式」中的選項有很好的描述,但我不確定他是否有在線的東西。

如果網站/應用程序需要驗證,那麼.Net具有良好的內置功能來存儲用戶角色和唯一用戶名。如果在認證過程中保存這些值,則可以通過User.IsInRole()和User.Identity.Name訪問這些值。

在會話中存儲會導致性能問題嗎?如果您的數據量比較小,比如電子郵件,那麼我會使用會話或cookie並避開數據庫。 運行性能測試並查看哪些性能最適合您。