簡體   English   中英

在會話中存儲用戶信息?

[英]Store user information in session?

您是否應該存儲有關每個請求所需用戶的信息,例如: 角色,電子郵件,用戶名等

在Session中,還是可以轉發數據庫每個請求這個信息?

謝謝

如果您沒有計划負載平衡,那么會話狀態是完全可以接受的。 如果會話狀態配置為使用數據庫持久性,請小心,因為這樣您不僅會訪問數據庫,還會產生對象序列化的開銷。

如果它是用戶特定的數據,那么分布式哈希表緩存系統可能會起作用。 像Memcached這樣的東西對此有好處,因為它們是內存緩存(性能),但是分布在多個服務器上(負載平衡),因此您可以充分利用這兩個世界。

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

我更喜歡使用加密的cookie。 在繁忙的大型系統中,db調用可能會變得昂貴。 會話很好,但如果您的會話后端是數據庫驅動的,那也會變得昂貴。 顯然,使用cookie時,必須包含身份驗證令牌檢查。

這取決於你所說的“應該”。 我曾經使用過幾個使用會話來緩存用戶信息的應用程序。 該方法運行良好,減少了每個Web請求所需的數據庫往返次數。

另一方面,它確實向您的Web服務器引入了狀態,因此您必須堅持使用一個Web服務器,使用“病態會話”(這會使管理Web服務器更復雜)或者開始將會話信息存儲在共享數據中商店(它消除了您在使用它時可能獲得的任何性能提升)。

會話數據也可以存儲在數據庫中,如果您的站點在Web Garden og Farm中運行,這將非常有用。 如果會話正在運行InProc,則用戶數據將保存在內存中,這會導致更快,但代價是可伸縮性。

另一種常見的方法是將其保存為ViewState,然后在每次回發時將其發送回客戶端和服務器之間,這當然會導致帶寬受限,但比InProc會話要好得多。

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

我將用戶ID保留在Session中,並且我將許多應用程序中的活動用戶記錄保存在Cache中,但是我再次將所有下拉列表的內容保留在Cache中,並且我必須每次都提供一個用戶下拉列表接着。

我有很多人驚呼“OMG你把它保存在Cache!?!?” 但實際上,它很有效。 更好的是,我在Cache中只有一個用戶列表副本,而不是每個應用程序實例一個副本(100個並發用戶意味着內存中可能有100個用戶列表副本)。 一般情況下,我在Cache中放置任何不經常更改的內容,如果它確實發生更改,則將其強制退出Cache,因此它將在下次訪問時重新加載。

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

如果同時用戶數量相當少且數據相對較小,則會話中的保存效果很好。

如果同時用戶數量很高且數據大小相對較低,則保存在cookie中效果很好。 顯然,cookie是公開可見的,因此如果它是敏感的,如電子郵件,則應加密。

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

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

Martin Fowler對“企業應用程序架構模式”中的選項有很好的描述,但我不確定他是否有在線內容。

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

存儲在會話中會導致性能問題嗎? 如果您的數據大小相對較小,如電子郵件,那么我會使用會話或cookie並避免使用數據庫。 運行性能測試,看看哪種方式最適合您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM