System.Web.Caching与Enterprise Library Caching Block的比较

29

对于一个将在Web应用程序和富客户端应用程序中使用的.NET组件,似乎有两个明显的缓存选项:System.Web.Caching或Ent. Lib. Caching Block。

  • 你使用哪个?
  • 为什么?

System.Web.Caching

在Web应用程序之外使用这个缓存是否安全? 我看到了一些混合的信息,但我认为答案是可能-有点不太靠谱。

我不期望使用其中的亮点SqlCacheDependency,但在.NET 3.5中添加CacheItemUpdateCallback似乎是一件非常好的事情。

Enterprise Library Caching Application Block

  • 其他块已经在使用,因此依赖关系已经存在
  • 缓存持久性并不重要;重新启动时重新生成缓存即可

有些缓存项始终应该可用,但需要定期刷新。对于这些项,在删除项目后得到回调通知并不是很方便。看起来客户端只能睡眠并轮询,直到缓存项重新填充。

Memcached for Win32 + .NET客户端

当您不需要一个分布式缓存时,有哪些优缺点?

4个回答

18

以下是我考虑到关于缓存主题的项目:

MemCached Win32 Velocity .net Cache Enterprise Library Caching Application Block

MemCached Win32: 最近我一直在使用MemCached Win32。这类似于Web农场(许多服务器为高可用性提供相同的内容),但它是一个缓存农场。这意味着,如果您没有足够的资源进行扩展,则可以最初在您的Web服务器本地安装它。然后,随着您未来的发展,您可以横向(更多的服务器)或纵向(更多硬件)扩展。该产品是从原始的MemCached移植而来,以在Windows上工作。这个产品已经在非常高的流量网站中得到广泛使用。http://lineofthought.com/tools/memcached

Velocity: 这是Microsoft针对像MemCached这样的产品提出的解决方案。MemCached已经存在了相当长一段时间,而Velocity处于CTP模式。我必须说,从我到目前为止所读到的东西来看,一旦它推出,这个产品肯定会吸引我的注意。但是我无法让自己在零记录的CTP产品上运行大型生产项目。不过,我已经开始尝试它,因为一旦它获得动力,对于那些被困在Windows世界中的人来说,MemCached甚至都无法相比!http://blogs.msdn.com/velocity/

.NET Cache: 没有理由忽视标准的.NET Cache。它已经内置并可以免费使用,无需(主要)设置即可使用。通过提供在本地内存、单个状态服务器或集中式数据库中存储项目的机制,它增强了灵活性。当您需要超过一个状态服务器(缓存在内存中)并且不想使用慢速数据库来保存缓存时,Velocity就派上用场了。

Enterprise Application Block: 我避免使用所有的企业应用程序块。它们是沉重的框架,给了我比我通常需要的更多!只要记得包装所有涉及非自己代码的内容并遵循简单的编码规则,就比使用这个更好!(当然仅代表我的观点-MySpace尽可能利用企业应用程序块!)

你不需要提前选择!我通常会创建一个缓存包装器,在我的代码中与Get、Set、Exists、Remove、ListKeys等方法通信。然后,这指向一个底层的缓存抽象层,可以指向MemCached、Velocity或.NET缓存。我使用StructureMap(或选择另一个IoC容器)来注入我想要在给定环境中使用哪种缓存的形式。在我的本地开发框中,我可能会在会话中使用.NET缓存。在生产中,我通常使用MemCached Win 32。但无论如何设置,你都可以轻松地交换各种系统以尝试出最适合自己的。你只需要确保你的应用程序尽可能少地知道关于缓存的任何信息!一旦这个抽象层建立起来,你就可以做一些事情,比如对进出缓存的所有数据运行压缩算法(gzip),这将允许你在缓存中存储10倍的数据量。- 透明地

如果您有兴趣,我在我的书中介绍了.NET Cache、MemCached Win32、StructureMap和适当的抽象。

ASP.NET 3.5 Social Networking (http://www.amazon.com/ASP-NET-3-5-Social-Networking-Enterprise-ready/dp/1847194788/ref=sr_1_1?ie=UTF8&s=books&qid=1225408005&sr=8-1) Andrew Siemer www.andrewsiemer.com blog.andrewsiemer.com www.socialnetworkingin.net

更新更改了列出使用memcached的网站链接。谢谢David注意到它已经损坏了!


你的书中是否描述了你提到的缓存包装层? - frankadelic
它讨论了包装器的概念。我认为我在其中包装了缓存,但我不确定我深入了解了MemCached。你可以在包装器后面使用Enyim MemCached客户端。然而,现在MS Velocity已经出现在场景中,你可能想要在Velocity周围制作一个更智能的包装器(它具有MemCached没有的大量功能)。如果你在MS堆栈上,你不能错过Velocity。 - Andrew Siemer
我知道这是一个相当旧的答案,但是Memcached流量站点的链接已失效(404)。不过答案非常好! - David Conde
大卫 - 我修复了那个坏掉的链接!感谢你发现了它。 - Andrew Siemer

3
请记住,EntLib文档专门引导您在ASP.NET应用程序中使用ASP.NET缓存。这可能是在此处使用它的最强烈建议。此外,EntLib缓存没有依赖关系,这对我来说是不使用它的一个重要原因。
我认为,在将System.Web作为应用程序的一部分进行发布方面,并没有技术限制,尽管在.NET 3.5页面上放置了该通知有点奇怪。Hanselman实际上说他最初对这个想法感到毛骨悚然,但后来变得确信了。此外,如果您阅读评论,他说该块具有太多移动部件,而ASP.NET缓存则更加轻量级。
我认为这正是Velocity将要解决的问题,但现在只是一个预览版 :-(
我建议使用Web.Caching,看看您的情况如何。如果您在顶部放置某种抽象层,则始终可以选择稍后将其替换为EntLib块,如果您发现问题的话。

2
值得注意的是,在.NET 4.0中,他们将缓存位移出System.Web,以解决此问题。 - PhilPursglove

2

看看memcached。它是一个非常酷、快速和轻量级的分布式缓存系统。它有多种流行语言的API,包括C#。除非客户端从某个服务器获取缓存数据,否则它可能不适用于客户端。但是,如果您将对memcached的使用抽象为特定接口,则可以使用另一个缓存系统实现该接口。


-2

@Davide Vosti

“如果他们将其放在Web命名空间中,我认为这是有充分理由的。” 那么这个逻辑是否也适用于机器人工作室中的并发和协调运行时(CCR)呢?不是吗?我也是这么想的。


3
这是我听过的最差/最弱的论点。缓存很可能是由asp.net团队实现的,因为在Web方案中确实需要它,这就是为什么它最终出现在该命名空间中的原因。但是,作为聪明的人,他们在没有任何依赖于IIS的情况下构建它。它只应该被移动到system.caching命名空间中。 - Micah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接