.Net简单的内存缓存

时间:2012-06-11 13:28:31

标签: .net caching

简洁,.Net生态系统中存在哪些SIMPLE内存缓存?

我在寻找的是:

  • 无配置(除了简单的API调用)。我不想搞乱外部配置文件,因为它们只会使部署复杂化。
  • Same-process(不是某些外部进程或服务器)。最好像
    一样容易创建 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进行配置。此外,虽然它支持根据存储的对象的NUMBER来限制缓存的大小,但它没有限制这些对象的SIZE的机制。
  • NCACHE
    • 对于我想要的用例可能有点过分,但最重要的是它是一种付费产品,这不是我想要处理的事情(与我在一两天内写一篇)相比。像往常一样,其快递版的使用限制阻碍了其用于任何生产目的。
  • 分布式缓存
    • 与我想要的完全相反(外部分布式流程)

我正在使用Google协议缓冲区(protobuf-net),因此我对每个项目的内存占用量进行了相对准确的估算。我正在缓存从数据库访问返回的数据,但我不想使用正式的ORM(我实际上正在使用PetaPoco,但这不是重点)。

在这个阶段,我计划实现自己的缓存,使用双链表和哈希(字典)来提供一旦达到缓存限制就从缓存中删除最近最少使用的项。但是,在我推出自己的选项之前,我想查看是否有人知道任何合适的选项。

4 个答案:

答案 0 :(得分:3)

那你最后用缓存做了什么?

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

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

它已经很老了,但我类似于你所说的

Generic cache with memory consumption

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

performance of system runtime caches

答案 3 :(得分:0)

查看MemoryCacheCodeProject上有关使用MemoryCache的文章。