C# MemoryCache 用于 2 种不同类型的键?
Posted
技术标签:
【中文标题】C# MemoryCache 用于 2 种不同类型的键?【英文标题】:C# MemoryCache for 2 different types of keys? 【发布时间】:2013-04-25 18:44:06 【问题描述】:我正在使用 MemoryCache
在我的 MVC .Net 应用程序中存储键/值对。
我使用MemoryCache
有两个主要目的。一种是存储用户 ID 的会话,另一种是存储常量(这只是一个示例)理论上两种情况下的键可能是相同的,所以我想要一些方法来分离这 2 个。
我正在考虑 2 或 3 种方法。哪种方式更优越?还是有更好的选择?
缓存中的每个键都将在前面加上一个命名空间。
“用户会话:1”、“用户会话:2” “常数:1”,“常数:2”
使用嵌套字典作为键。
将有一个键“user_sessions”,其值将是一个将 ids 映射到会话对象的字典。将有一个键“常量”,其值为字典。
每个“命名空间”都有自己的 MemoryCache 实例。
#2 的缺点是,当我想获取属于用户 ID 的值时,我需要先获取字典,然后获取该字典中某个键的值。这意味着我需要将字典存储在内存中。
IE:
Dictionary<string, string> userSessions = MemoryCache.Default["user_sessions"]
object session = userSessions.get("1");
【问题讨论】:
为什么需要将常量存储在字典中?你不能只使用常量吗? @Kenneth 我只是以它为例。问题仍然存在:如何将 MemoryCache 用于 2 种不同类型的键? 使用 1。您不必担心访问您在 2 中建议作为选项的包含字典的并发问题。这个答案很有帮助:***.com/a/13425322/112196 【参考方案1】:选择选项#3!
对于程序员来说更容易访问。 这是最快的解决方案(请参阅其他解决方案的 cmets) 它是内存效率最高的解决方案(参见其他解决方案的 cmets)选项 #2:
你自己说的。 如果缓存决定删除某个键,则会删除整个字典,从而导致重新加载更多值。选项#1:
您不必连接字符串(性能和内存) 较长的键名会产生较长的比较时间。 添加项目会更慢,因为它包含两倍的键。【讨论】:
值得注意的是,docs 警告不要创建比实际需要更多的MemoryCache
实例。他们没有具体说明原因,但要记住一些事情。
是的,我知道。正在运行一个进程以删除旧的和过期的项目。由于缓存越来越多,这个过程会花费越来越多的时间,但这不是程序员在这个阶段需要担心的事情,除非所有内核都运行 90%。【参考方案2】:
我不确定您的实际实现是什么,但请谨慎使用 MVC 框架以这种方式使用会话。用户标识符最好留在 cookie 中。不管怎样,我偶尔也能看到走这条路的用途。
我会避免以这种方式在缓存中使用字典。我不知道您正在查看哪种类型的内存分配,但如果服务器具有高流量和多个字典,它可能会变得非常难看。正如上面评论中提到的,您还必须以这种方式担心字典的并发问题。
您提供的选项中更好的方法是为每个命名空间提供它自己的缓存实例。
【讨论】:
以上是关于C# MemoryCache 用于 2 种不同类型的键?的主要内容,如果未能解决你的问题,请参考以下文章
分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S C/S项目均可以使用!
.NET Core 2.0迁移技巧之MemoryCache问题修复