【问题标题】:.Net Simple In-Memory Caches.Net 简单的内存缓存
【发布时间】:2012-06-11 13:28:31
【问题描述】:

简而言之,.Net 生态系统中存在哪些 SIMPLE In-Memory Cache?

我正在寻找的是:

  • 无配置(除了简单的 API 调用)。我不想弄乱外部配置文件,因为它们只会使部署复杂化。
  • 同一进程(不是某些外部进程或服务器)。最好像
    var myCache = new SimpleCache(1024 * 1024 * 100); // 100 MB 一样轻松创建
  • 指定的内存限制
  • 根据最少使用情况从缓存中清除项目
  • 基于时间的过期(不是必需的,但在其他情况下可能很有用)
  • 适用于 .Net 3.5

我已经研究过这些选项:

  • ASP.Net System.Web.Caching
    • 其 API 不支持对缓存大小进行任何形式的控制,也不支持基于使用的优先级。因此,您完全任由它决定何时确定有足够的内存压力来清空缓存。
  • System.Runtime.Caching
  • Microsoft 企业库 - 缓存块
    • 除了有重量级的名声外,我不喜欢它使用 XML 文件或 app.config 的配置。此外,虽然它支持根据存储的对象数量限制缓存的大小,但它没有限制这些对象大小的机制。
  • NCache
    • 对于我想要的用例来说可能有点矫枉过正,但最重要的是,它是一种付费产品,我不想处理(相比之下,我只是在一两天内写一个)。像往常一样,它的速成版有使用限制,不鼓励将其用于任何生产目的。
  • MemCacheD
    • 与我想要的完全相反(外部分布式进程)

我正在使用 Google Protocol Buffers (protobuf-net),因此我确实对每个项目的内存占用量有一个相对准确的估计。我正在缓存从数据库访问返回的数据,但我不想使用正式的 ORM(我实际上正在使用 PetaPoco,但这不是重点)。

在这个阶段,我计划实现我自己的缓存,使用双链表和散列(字典)在达到缓存限制后从缓存中删除最近最少使用的项目。但是,我想在自己推出之前先看看是否有人知道任何合适的选择。

【问题讨论】:

  • 这绝非易事,没有良好过期策略的缓存就是内存泄漏。不喜欢可用的东西始终是构建自己的第一动力。
  • 我想指定它应该占用的最大内存量,而不是过期策略。您无法真正衡量 .Net 中占用了多少内存对象,但我使用的协议缓冲区有一个相当有用的衡量标准。
  • 如果你把它开发成一个相当通用的缓存,那么也许你可以把它放在 CodeProject 之类的东西上,供其他人使用?将一个简单的原型放在一起应该相当简单,并且很容易获得高测试覆盖率。
  • Mare Infinitus codeproject.com/Articles/7684/… 的链接是我用作基础的。我将来可能有理由让它更通用,但在它是一个特定的用例(目前不使用泛型)和它是我雇主的知识产权之间,我怀疑我会把它放在 CodeProject 上。

标签: .net caching


【解决方案1】:

那么你最终对缓存做了什么?

我有一个我正在研究的通用缓存原型,除了缓存限制是容量(项目数)而不是内存使用量之外,它几乎可以满足您的需求,但它有一个您可能会喜欢的额外功能:本地持久性。

缓存由层构成,您可以有一个单层:内存,双层:内存+本地持久性,或三层:内存+本地持久性+网络共享。您可以根据需要使用任何图层组合。虽然网络共享被设计为 .net 远程服务,可以安装在网络上的任何计算机上,并且可以被客户端缓存自我发现,但目前还没有完全发挥作用。

缓存是通过接口 ICache 访问的通用类。本地持久缓存使用 SQL Express Compact 4 创建动态数据库和表,其中包含 TKey 的所有字段、时间戳和序列化为 Image 列的 TValue。 在多层配置的情况下,当您在顶级缓存上使用 TryGetValue( TKey key, out TValue value ) 方法时,如果第一层(内存缓存)没有它内部与下一层(本地持久的),然后下一个......直到没有更多的缓存可用于提供数据。当内存缓存丢弃一个项目时,它让下一个缓存有机会将该项目添加到其层,因此在持久缓存的情况下,数据会被存储以供将来的请求使用。

缓存具有用户定义的保留时间参数(即内存缓存为几分钟,本地持久缓存为 30 天)和容量。

如果有人感兴趣,我可以将其发布为公共域代码。

【讨论】:

    【解决方案2】:

    AppFabric for Windows Server 中的缓存功能怎么样?试试看 ! http://msdn.microsoft.com/en-us/windowsserver/ee695849.aspxhttp://msdn.microsoft.com/en-us/library/hh334364.aspx

    但如果市场上没有提供所需行为的产品,您将不得不使用设计模式实现自己的自定义缓存层。

    【讨论】:

    • 很高兴看到一个我还没有考虑过的选项,也很高兴即使它看起来面向 XML 配置,但它具有等效的编程配置选项。但是,这不是我想要的,因为它似乎没有提供基于内存使用进行限制的功能。通过对象数量限制缓存是相当无用的,因为这些对象可能是每个消耗 1 KB 或每个消耗 1 GB 的树的根。
    【解决方案3】:

    它很老了,但我和你说的很像

    Generic cache with memory consumption

    这是另一个具有相关场景的 SO:

    performance of system runtime caches

    【讨论】:

    • +1 因为这实际上是我两个月前阅读的文章,它为我自己的设计提供了基础。我没有查看完整的源代码,但这篇文章是一个很好的起点。
    【解决方案4】:

    查看MemoryCacheCodeProject 上关于使用 MemoryCache 的这篇文章。

    【讨论】:

    • 它适用于 3.5 吗?它似乎是 4.0 框架。
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2010-10-11
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多