2013-05-01 75 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中。无论哪种方式,我都可以看到使用这条路线。

我会避免以这种方式在缓存中使用字典。我不知道你在寻找什么类型的内存分配,但如果服务器拥有高流量和多个字典,它可能会变得很难看。正如上面在评论中提到的那样,您也必须以这种方式担心字典中的并发问题。

您提供的选项的更好方法是为每个名称空间提供它自己的缓存实例。