使用 MemoryCache 的多个实例

2024-04-01

我想使用以下方法向我的应用程序添加缓存功能System.Runtime.Caching命名空间,并且可能希望在多个位置和不同的上下文中使用缓存。 为此,我想使用多个 MemoryCache 实例。

然而,我看到here http://msdn.microsoft.com/en-us/library/system.runtime.caching.objectcache.aspx不鼓励使用多个 MemoryCache 实例:

MemoryCache 不是单例,但您应该只创建几个或可能只有一个 MemoryCache 实例,并且缓存项目的代码应该使用这些实例。

多个 MemoryCache 实例将如何影响我的应用程序? 我觉得这很奇怪,因为在我看来,在应用程序中使用多个缓存是一种非常常见的情况。

EDIT:更具体地说,我有一个类应该为每个实例保留一个缓存。我应该避免使用MemoryCache并寻找不同的缓存解决方案?正在使用MemoryCache这种情况算不好的,如果是的话,为什么?


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

内存缓存主要是因为其内存管理功能而打算单独使用。除了性能计数器(确实有一些开销)之外,MemoryCache 还能够在耗尽分配的内存时使项目过期。

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

from MemoryCache.CacheMemoryLimit 属性 http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.cachememorylimit.aspx

通过仅使用 MemoryCache 的一个实例,它可以在整个应用程序实例中有效地应用这种内存管理。使整个应用程序中最不重要的项目过期。这可确保最大程度地使用内存,而不会超出您的硬件能力。通过限制任何一个 MemoryCache 的范围(例如类的一个实例),它无法再有效地管理应用程序的内存(因为它无法“看到”所有内容)。如果所有这些缓存都“繁忙”,您可能会更难管理内存,并且永远不会那么高效。

这对于没有专用服务器的应用程序来说尤其敏感。想象一下,您正在共享服务器上运行您的应用程序,其中您只分配了 150mb RAM(常见的廉价 10 美元/月托管),您需要依靠缓存来最大限度地使用它而不超过它。如果超过此内存使用量,您的应用程序池将被回收,并且您的应用程序将丢失内存缓存中的所有内容! (常见的廉价托管做法)同样的情况也适用于在某些共享公司服务器上托管的非 Web 应用程序。同样,您被告知不要占用该计算机上的所有内存并与其他一些业务应用程序和平共存。

内存限制、应用程序池回收、丢失缓存等问题是网络应用程序常见的“致命弱点”。当应用程序最繁忙时,它们重置最频繁,因为超出了内存分配,丢失了所有缓存条目,因此做了最多的工作来重新获取本来应该缓存的内容。这意味着应用程序在最大负载下实际上会损失性能而不是获得性能。

我知道 MemoryCache 是 System.Web.Caching.Cache 实现的非 Web 特定版本,但这说明了缓存实现背后的逻辑。如果您不独占使用硬件,则相同的逻辑可以应用于非 Web 项目。请记住,如果您的缓存强制计算机开始进行页面文件交换,那么您的缓存将不再比磁盘上的缓存快。你总是希望在某个地方有一个限制,即使这个限制是 2GB 之类的。

就我而言,在阅读完相关内容后,我转而在应用程序中使用一个“公共静态 MemoryCache”,并且我只是通过缓存键来隔离缓存项目。例如,如果您想在每个实例上进行缓存,您可以使用类似“instance-{instanceId}-resourceName-{resourceId}”之类的缓存键。将其视为缓存条目的名称间隔。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 MemoryCache 的多个实例 的相关文章

  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • 警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

    我的代码中有这个问题 bool CBase isNumber return id MID NUMBER bool CBase isVar return id MID VARIABLE bool CBase isSymbol return i
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m
  • 返回导航缓存 - IE

    当我在 IE 11 上运行 Web 应用程序时 收到如下警告消息 DOM7011 此页面上的代码禁用了后退和前进缓存 为了 更多信息 请参阅 http go microsoft com fwlink LinkID 291337 http g
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • 当 Generic.List.Add 是函数中的最后一个语句并且开启尾调用优化时,性能会受到影响

    我遇到了一个奇怪的性能损失 我将其归结为以下代码
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • 您对“大规模 C++ 软件设计”的看法 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正在阅读亚马逊评论 https rads stackoverflow com amzn click com 0201633620 and ACC
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • .NET WebClient:DownloadString 在哪里?

    我可能在这里遗漏了一些东西 但是当我使用 WebClient 并查找 DownloadString 方法 如书籍示例中所示 时 我只看到 DownloadStringAsync 我缺少什么导入 您使用的是 Silverlight 吗 Sil
  • Gremlin.net 文本包含等效项

    我正在使用 Gremlin net 库连接到 janus 图形服务器 我使用 cassandra 和弹性搜索进行数据存储和索引 在我使用的 gremlin 语言和 gremlin 控制台中文本包含在属性的文本中进行搜索 我正在使用混合索引
  • 如何同步nosql db(ravendb)中的更改

    我已经开始在 RavenDB 的示例上学习 NoSQL 我从一个最简单的模型开始 假设我们有由用户创建的主题 public class Topic public string Id get protected set public stri
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • 将一个 IEnumerable 拆分为多个 IEnumerable

    我是 linq 新手 我需要根据指示器将 Couple string text bool Indicator 类型的 IEnumerable 拆分为多个 IEnumerable 我尝试使用skipWhile 和 TakeWhile 但没有找

随机推荐