8

MemoryCache用来在我的 MVC .Net 应用程序中存储键/值对。

我使用 2 个主要目的MemoryCache。一种是存储用户 ID 的会话,另一种是存储常量(这只是一个示例)理论上两种情况下的键可能是相同的,所以我想要一些方法来分离这 2 个。

我正在考虑2或3种方法。哪种方式更优越?还是有更好的选择?

  1. 缓存中的每个键都将由命名空间前置。

    “用户会话:1”、“用户会话:2”
    、“常量:1”、“常量:2”

  2. 使用嵌套字典作为键。

    将有一个键“user_sessions”,其值将是一个将 ID 映射到会话对象的字典。将有一个键“常量”,其值将是一个字典。

  3. 每个“命名空间”都有自己的 MemoryCache 实例。

#2 的缺点是,当我想获取属于用户 ID 的值时,我需要先获取字典,然后获取该字典中某个键的值。这意味着我需要将字典存储在内存中。

IE:

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

2 回答 2

6

选择选项#3!

  • 对于程序员来说,它更容易访问。
  • 这是最快的解决方案(请参阅其他解决方案的评论)
  • 这是最节省内存的解决方案(请参阅其他解决方案的评论)

选项#2:

  • 你自己说的。
  • 如果缓存决定删除一个键,则整个字典都会被删除,从而导致更多的值重新加载。

选项1:

  • 您不必连接字符串(性能和内存)
  • 较长的键名会产生较长的比较时间。
  • 添加项目会更慢,因为它包含两倍的键。
于 2013-05-01T18:16:41.790 回答
1

我不确定您的实际实现是什么,但请谨慎使用 MVC 框架以这种方式使用会话。用户标识符最好留在 cookie 中。无论哪种方式,我有时也可以看到走这条路的用途。

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

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

于 2013-05-01T18:21:22.243 回答