单个与多个MemoryCache实例

时间:2011-05-26 14:58:59

标签: c# .net caching

MemoryCache默认带有默认缓存,可以创建其他命名缓存。

似乎在不同实例中隔离不同进程的结果的缓存可能有好处。例如,对索引的查询结果可以缓存在“IndexQueryResult”缓存中,并且数据库查询的结果可以缓存在“DatabaseQueryResult”中缓存。这是相当人为的,但解释了原则。

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

我是否在浪费时间考虑多个缓存的想法,或者这样做是否真的有价值?

1 个答案:

答案 0 :(得分:5)

我不能说出前几个问题,我很想听听那些问题的答案。但是,我可以说到目前为止我们在产品中使用多个缓存已经有了很好的体验。以下是我看到的好处:

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

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