【问题标题】:Caching - IDictionary vs top level key prefixes缓存 - IDictionary 与顶级键前缀
【发布时间】:2013-06-01 01:52:28
【问题描述】:

当将字典存储到缓存中以便快速查找时,我可以想到两个选项: 要么将整个字典存储为缓存项,要么在缓存键前面加上标识符。

例子:

myPseudoCache.Put("Users", myDictionaryWithGuidsAsKeys);

myPseudoCache.Put("Users_" + userId, singleUserEntity);

环境是 C#,在 ASP.NET 应用程序中带有 HttpRuntime.Cache,如果有兴趣的话,但我也对一般想法(可维护性方面、性能等)感兴趣。

我正在尝试在这里做出合理的决定,但真的不确定具体的优缺点。也许有更多经验的人可以给我一些关于应该考虑什么的建议?非常感谢!

【问题讨论】:

  • 第二个会让foreach缓存的项目变得非常困难,如果这是一个问题的话。
  • 感谢@Rawling,绝对是重要的事情。虽然我现在不需要迭代对象,但我很可能需要在某个时候这样做。再次感谢这方面!

标签: c# asp.net caching dictionary


【解决方案1】:

我认为更好的选择是保留整个字典而不是分隔值。首先,在 Dictionary 中的键之间进行迭代要容易得多。对我来说,容量没有区别。所以最大的好处是这个选项更容易维护,尤其是当你从缓存中获取数据时,代码会更清晰。

【讨论】:

  • 感谢您的回答,我现在完全同意您的看法。对我来说,在得到这些答案之后,这似乎是正确、自然的方式:)
【解决方案2】:

这实际上是一种权衡。如果 myPseudoCache 将只包含“用户”,您可以使用第二种方法 - 即 myPseudoCache.Put("Users_" + userId, singleUserEntity);

如果有许多不同的项目(例如组、角色),尤其是频率不同的项目,则爆炸式缓存结构可能不是最佳的。在这种情况下,遵循树状结构或字典中的字典是有意义的 - 即myPseudoCache.Put("Users", myDictionaryWithGuidsAsKeys);

例如;如果您的角色数量较少,则角色查找不会因为用户数量异常多而受到影响。

【讨论】:

  • 我明白了,在我的情况下,缓存不仅会存储一种对象。您的回答连同@Rawling 的评论已经让我想存储一本字典。谢谢!
  • 谢谢,通过编辑,您的回答完全满足了我的担忧。我会选择树状的方法,谢谢你的解释!
猜你喜欢
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2019-01-09
相关资源
最近更新 更多