8

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

我正在寻找的是:

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

我已经研究过这些选项:

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

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

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

4

4 回答 4

3

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

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

缓存是按层构造的,你可以有一层:内存,双层:内存+本地持久性,或三层:内存+本地持久性+网络共享。您可以根据需要使用任何图层组合。尽管网络共享被设计为 .net 远程服务,可以安装在网络上的任何计算机上并且可以被客户端缓存自我发现,但功能还不是很完善。

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

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

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

于 2012-08-30T20:03:50.310 回答
1

It is quite old, but i resembles what you are talking about

Generic cache with memory consumption

and here is another SO with a relevant scenario:

performance of system runtime caches

于 2012-06-11T22:13:10.177 回答
1

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

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

于 2012-06-11T21:22:29.590 回答
0

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

于 2013-10-30T09:04:32.317 回答