c# - 单个与多个 MemoryCache 实例

标签 c# .net caching

MemoryCache 默认带有一个默认缓存,并且可以创建额外的命名缓存。

在不同的实例中隔离不同进程的结果缓存似乎有优势例如,针对索引的查询结果可以缓存在“IndexQueryResult”缓存中,而数据库查询的结果可以缓存在“DatabaseQueryResult”中缓存。这有点做作,但解释了原理。

导致驱逐的一个缓存上的内存压力是否会影响其他缓存? .Net 管理多个缓存的方式与其管理一个缓存的方式有何不同?

我是在浪费时间考虑多个缓存的想法,还是这样做有真正的值(value)?

最佳答案

我无法回答前几个问题,但我很想知道这些问题的答案。但是,我可以说到目前为止,我们在产品中使用多个缓存方面获得了很好的体验。以下是我看到的好处:

  • 减少键冲突的机会:我们可以简单地创建一个特定于给定的缓存,而不是想出某种方案来确保没有两个单独的值以相同的键结束存储库类型,并且知道只要该存储库类使用其对象唯一的键,我们就不会发生冲突。
  • 通过缓存逐出提高精度:“拥有”特定缓存实例的存储库类型可以订阅系统范围事件总线上的某些事件类型,以便它知道缓存的某些部分何时需要清除缓存。如果幸运的话,它可以完全根据已发布事件的参数来确定要清除的条目的键。然而,通常情况并非如此,我们必须清除整个缓存或遍历所有缓存值以找出哪些受已发布事件的影响。如果我们为系统中的所有数据类型使用单个缓存实例,我们最终会爬过很多不相关的条目。通过使用单独的缓存,我们可以将搜索限制为该特定存储库负责填充的值。

关于第二点:我们还构建了一个 UI 来公开系统中的所有缓存实例,并允许我们通过单击按钮清除其中的任何一个。当我们需要直接对数据库进行更改,并且需要系统在不重新启动服务器的情况下获取这些更改时,这会派上用场。同样,如果我们只使用一个缓存,我们就不可能那么精确:我们必须清除系统范围内的所有缓存值,而不仅仅是与我们修改过的数据类型关联的值。

关于c# - 单个与多个 MemoryCache 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140704/

相关文章:

c# - 使用 DLR API 从 IronRuby 脚本捕获标准输出

c# - 使用 Google 联系人 API 以编程方式将 "Birthday"添加到 Google 联系人?

c# - 条件分组正在被删除

c# - 使用 CacheCow 缓存 ASP.NET Web API

caching - 服务于 Varnish 中的多个部位

c# - 如何在 FFMPEG 中设置所有视频的纵横比?

c# - MySql 异常 : Connection need to valid and open. C#

c# - 当 AggregateException.InnerExceptions.Count > 1 时,有人遇到过这种情况吗?

c# - 在另一个用户上下文中执行代码

performance - 证明 memcache 比文件系统缓存更快?