2013-05-01 70 views
5

我使用MemoryCache在我的MVC .Net應用程序中存儲鍵/值對。C#MemoryCache用於2種不同類型的密鑰?

我使用的主要目的有兩個:MemoryCache。一個是存儲用戶ID的會話,另一個是存儲常量(這只是一個例子)。這兩個鍵的理論上都是相同的,所以我想用一些方法來分開這兩個。 2或3種方式。哪種方法更好?還是有更好的選擇?

  1. 高速緩存中的每個鍵都會被命名空間前置。

    「USER_SESSION:1」, 「USER_SESSION:2」
    「常數:1」, 「常數:2」

  2. 使用嵌套詞典作爲密鑰。

    將會有一個關鍵的「user_sessions」,其值將是一個將id映射到會話對象的Dictionary。將有一個關鍵的「常量」,其價值將是一個詞典。

  3. 每個「名稱空間」都有它自己的MemoryCache實例。

的缺點與#2是當我想要得到屬於用戶ID的價值,我需要先拿到字典,然後得到價值在字典中的一個關鍵。這意味着我需要將字典存儲在內存中。

IE:

Dictionary<string, string> userSessions = MemoryCache.Default["user_sessions"] 
object session = userSessions.get("1"); 
+0

爲什麼你需要在字典中存儲常量?難道你只是使用常量? – Kenneth 2013-05-01 18:09:00

+0

@Kenneth我只是用它作爲例子。問題依然存在:如何將MemoryCache用於2種不同類型的密鑰? – 2013-05-01 18:09:41

+0

使用1.您不必擔心訪問您在2中作爲選項提供的包含字典的併發性問題。此答案有幫助:http://stackoverflow.com/a/13425322/112196 – 2013-05-01 18:18:10

回答

2

圍棋的選項#3!

  • 對於程序員來說更容易訪問。
  • 這是最快的解決方案(見其他的解決方案評論)
  • 這是最內存高效的解決方案(見其他的解決方案評論)

選項#2:

  • 你自己說過。
  • 如果高速緩存決定刪除密鑰,則會刪除整個字典,從而導致更多值的重新加載。

選項#1:

  • 您不必concatinate字符串(性能和memeory)
  • 較長的鍵名稱產生較長比較倍。
  • 添加項目會比較慢,因爲它包含兩倍的密鑰。
+2

值得注意的是, [docs](http://msdn.microsoft.com/zh-cn/library/system.runtime.caching.memorycache.memorycache.aspx)警告不要創建比您真正需要的更多的MemoryCache實例。他們沒有具體說明爲什麼,但要記住一些事情。 – 2013-05-01 18:25:53

+1

是的,我知道。正在運行一個進程來刪除舊的和過期的項目。這個過程需要更多的時間,因爲有更多的緩存,但這不是程序員在這個階段需要擔心的問題,除非所有內核都運行90%。 – 2013-05-01 18:38:10

1

我不確定你的實際實現是什麼,但要謹慎使用MVC框架以這種方式使用會話。用戶標識符最好留在Cookie中。無論哪種方式,我都可以看到使用這條路線。

我會避免以這種方式在緩存中使用字典。我不知道你在尋找什麼類型的內存分配,但如果服務器擁有高流量和多個字典,它可能會變得很難看。正如上面在評論中提到的那樣,您也必須以這種方式擔心字典中的併發問題。

您提供的選項的更好方法是爲每個名稱空間提供它自己的緩存實例。