使用多个MemoryCache实例

我想使用System.Runtime.Caching命名空间将cachingfunction添加到我的应用程序,并且可能要在几个地方和不同的上下文中使用caching。 为此,我想使用几个MemoryCache实例。

不过,我在这里看到,使用MemoryCache的多个实例是不鼓励的:

MemoryCache不是一个单例,但是应该只创buildless数或者可能只有一个MemoryCache实例,并且caching项的代码应该使用这些实例。

多个MemoryCache实例如何影响我的应用程序? 我觉得这种奇怪,因为在我看来,在一个应用程序中使用多个caching是一个相当普遍的情况。

编辑:更具体地说,我有一个类应该保持每个实例的caching。 我应该避免使用MemoryCache并寻找不同的caching解决scheme吗? 在这种情况下使用MemoryCache被认为是不好的,如果是的话,为什么呢?

我最近自己也经历过这个。 考虑到内存caching将是特定于stream程的(不是跨多个实例的网站或本地业务应用程序或多个服务器共享),除了代码组织原因(可以通过其他方式实现),拥有多个MemoryCache实例没有任何好处, 。

内存caching主要是由于其内存pipe理function而被单独使用。 除了性能计数器(其确实有一些开销)之外,MemoryCache在耗尽分配的内存时也能够使项目过期。

如果caching的当前实例超过了由CacheMemoryLimit属性设置的内存限制,则caching实现将删除caching条目。 应用程序中的每个caching实例都可以使用由CacheMemoryLimit属性指定的内存量。

从MemoryCache.CacheMemoryLimit属性

通过仅使用MemoryCache的一个实例,它可以在整个应用程序实例中有效地应用这种内存pipe理。 将整个应用程序中最不重要的项目过期。 这确保了最大的内存使用,而不会超过您的硬件function。 通过限制任何一个MemoryCache的范围(比如一个类的一个实例),它不能有效地pipe理你的应用程序的内存(因为它不能“看到”所有东西)。 如果所有这些caching都是“繁忙的”,则可能难以pipe理内存,而且效率也不会太高。

这在没有专用服务器的应用程序中特别敏感。 想象一下,你正在共享服务器上运行你的应用程序,你只需要分配150MB的内存(普通便宜的10美元/月托pipe),你需要指望你的caching使用它,而不超过它。 如果你超过了这个内存使用量,你的应用程序池将被回收,你的应用程序将失去所有的内存caching! (常见的廉价主机实践)同样的情况也适用于某些共享企业服务器上的非网站应用程序。 同样的事情,你被告知不要在该机器上占用所有内存,并与其他业务应用程序和平共处。

内存限制,应用程序池回收,丢失caching的东西是一个常见的“致命弱点”的networking应用程序。 当应用程序是最繁忙的时候,由于超过了内存分配,它们会最经常地重置,从而丢失了所有的高速caching条目,因此最重要的工作是重新获取应该被caching的东西。 这意味着应用程序实际上在最大负载下失去性能,而不是获得性能。

我知道MemoryCache是​​System.Web.Caching.Cache实现的非Web特定版本,但是这说明了caching实现背后的逻辑。 如果您没有独占使用硬件,则可以在非Web项目中应用相同的逻辑。 请记住,如果caching强制机器开始进行页面文件交换,那么caching不再比在磁盘上caching更快。 即使这个限制是2GB或者什么的,你总是会在某个地方想要一个限制。

在我读完这个之后,我切换到在我的应用程序中使用一个“公共静态MemoryCache”,我简单地通过caching键分隔caching项目。 例如,如果要caching每个实例,则可以使用caching键,如“instance- {instanceId} -resourceName- {resourceId}”。 把它看作名字间隔你的caching条目。

希望有所帮助!

我也用了几个。 一般每个types一个。

看看MemoryCache我看到它挂钩到AppDomain事件并维护性能计数器。 我怀疑是有一些开销资源明智的使用多个(例如CPU,计数器和内存),这就是为什么它是不鼓励的。