簡體   English   中英

在asp.net應用程序中緩存用戶數據

[英]Caching user data in asp.net application

在asp.net 4.0中緩存網站用戶數據的最佳方法是什么?

我有一個用戶設置表,該表可以跟蹤各種用戶或特定於會話的內容,例如UI元素的狀態(打開/關閉),首選項,是否關閉了某些對話框等等。 由於這些更改不是很頻繁(無論如何對於每個用戶),而是經常查找,因此緩存它們似乎是明智的。 最好的方法是什么? 這些是我確定的選項...

  1. 將它們直接存儲在HttpContext.Current.Session (例如Session["setting_name"]
  2. 將它們存儲在HttpContext.Current.Cache
  3. 使用全局靜態字典,例如static ConcurrentDictionary<string,string> ,其中鍵是唯一的userID +設置名稱值
  4. 將每個會話的字典對象存儲在SessionCache

最明智的方法是什么? 從實際的角度來看, SessionCache有何不同? 將字典存儲為單個會話/緩存對象而不是直接添加大量值是否有意義? 我認為查找可能會更快,但更新會更慢,因為當更改字典時,我必須重新存儲整個字典。

使用全局靜態緩存可能會有什么問題或好處? 看來這將是最快的,但我必須控制大小。 如果它達到某個大小,我可以定期刷新它,或者保留一個交叉引用隊列,並在達到一定大小時首先刪除最舊的東西。 這有意義還是只是太努力了?

Session可能最終會存儲在進程外或數據庫中,這可能會使檢索變得昂貴。 如果您的應用程序要托管在服務器場(而不是單個服務器)中,則可能會使用會話數據庫。 服務器場提供了改進的可伸縮性和可靠性,並且通常是常見的部署方案。 你有想過嗎

同樣,當您使用非進程Session時,它最終會被序列化以發送到進程外或數據庫中,並在檢索時進行反序列化 ,從而有效地完成了上述操作:

... 更新會比較慢,因為更改后我必須重新存儲整個字典。 ...

..因為,即使您使用單獨的會話密鑰,用戶的整個Session對象也會一起序列化和反序列化(一次全部)。

Cache位於服務器場中特定服務器上的內存中,因此比進行處理或進入數據庫要高效得多。 但是,一台服務器上的緩存中的內容可能不在另一台服務器上的緩存中。 因此,如果用戶的后續請求被定向到服務器場中的另一台服務器,則該服務器上的緩存可能尚未保存該用戶的任何項目。

不過,如果出於性能原因進行緩存,建議您使用Cache

ps是的,您正在努力。 除非確實需要,否則不要重新發明輪子。 :-)

將您的信息放入memcached以實現可伸縮性可能更好

暫無
暫無

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

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