【发布时间】: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
- 不是一个选项,因为这是在 .Net 4.0 中添加的,这篇文章似乎表明它的性能很差:Performance of 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 上。