MemoryCache 默认情况下带有默认缓存,并且可以创建其他命名缓存。
似乎在不同实例中隔离不同进程的结果的缓存可能有优势。例如,针对索引的查询结果可以缓存在“IndexQueryResult”缓存中,而数据库查询的结果可以缓存在“DatabaseQueryResult”缓存中。这是相当做作的,但解释了原理。
导致驱逐的一个缓存上的内存压力是否会影响其他缓存? .Net 管理多个缓存的方式与管理一个缓存的方式有什么不同吗?
我是否在浪费时间考虑多个缓存的想法,或者这样做有真正的价值吗?
我无法回答前几个问题,但我有兴趣听到这些问题的答案。不过,我可以说,到目前为止,我们在产品中使用多个缓存获得了良好的体验。以下是我看到的好处:
-
减少按键碰撞的机会:我们可以简单地创建一个特定于给定存储库类型的缓存,并且知道只要该存储库类使用唯一的键,而不是提出某种方案来确保没有两个单独的值最终具有相同的键到它的对象,我们不会发生碰撞。
-
通过缓存驱逐提高精度:“拥有”特定缓存实例的存储库类型可以订阅系统范围事件总线上的某些事件类型,以便它知道何时需要清除缓存的某些部分。如果幸运的话,它可以纯粹根据已发布事件的参数来确定要清除的条目的键。然而,情况通常并非如此,我们必须清除整个缓存或迭代所有缓存的值以找出哪些值受到已发布事件的影响。如果我们对系统中的所有数据类型使用单个缓存实例,我们最终会爬取大量不相关的条目。通过使用单独的缓存,我们可以将搜索限制为该特定存储库负责填充的值。
关于第二点:我们还构建了一个 UI 来公开系统中的所有缓存实例,并允许我们通过单击按钮来清除其中的任何一个。当我们需要直接对数据库进行更改并且需要系统无需重新启动服务器即可获取这些更改时,这会派上用场。同样,如果我们只使用单个缓存,我们就不可能那么精确:我们必须清除系统范围内的所有缓存值,而不仅仅是与我们修改的数据类型关联的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)