.Net简单的内存缓存

问题描述 投票:8回答:4

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

我在寻找的是:

  • 无配置(除了简单的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进行配置。此外,虽然它支持基于存储的对象的NUMBER来限制高速缓存的大小,但是它没有用于限制那些对象的SIZE的机制。
  • NCACHE 对于我想要的用例可能有点过分,但最重要的是它是一个付费产品,这不是我想要处理的东西(与我相比,我只需要在一两天内写一个)。与往常一样,其快递版具有使用限制,不鼓励其用于任何生产目的。
  • Memcached的 与我想要的完全相反(外部分布式流程)

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

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

.net caching
4个回答
3
投票

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

我有一个我正在研究的通用缓存原型,除了缓存限制是由容量(项目数)而不是内存使用量之外,它实际上是你想要的,但它有一个你可能会欣赏的额外功能:本地持久性。

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

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

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

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


1
投票

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

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


1
投票

这是相当古老的,但我类似于你所说的

Generic cache with memory consumption

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

performance of system runtime caches


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.