29

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

  • 你用什么?
  • 为什么?

系统.Web.缓存

这在网络应用程序之外使用是否安全?我看到了混杂的信息,但我认为答案可能不是真的。

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

企业库缓存应用程序块

  • 其他块已在使用中,因此依赖项已存在
  • 不需要缓存持久性;重新启动时重新生成缓存是可以的

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

用于 Win32 + .NET 客户端的 Memcached

当您不需要分布式缓存时,有什么优点和缺点?

4

4 回答 4

18

这些是我为缓存主题考虑的项目:

MemCached Win32 Velocity .net Cache Enterprise Library 缓存应用程序块

MemCached Win32:直到最近我一直在使用 MemCached Win32。这类似于网络场(许多服务器提供相同的内容以实现高可用性),但它是一个缓存场。这意味着如果您没有足够的资源来扩大规模,您最初可以将它安装在您的 Web 服务器上。然后,随着您的发展,您可以水平扩展(更多服务器)或垂直扩展(更多硬件)。这是一个从原始 MemCached 移植到 Windows 上的产品。该产品已广泛用于高流量站点。 http://lineofthought.com/tools/memcached

Velocity:这是微软对 MemCached 等产品的回答。MemCached 已经出来很长时间了,Velocity 处于 CTP 模式。我必须说,从我目前所阅读的内容来看,这款产品一旦推出,肯定会让我大吃一惊。但是我不能让自己在零跟踪记录的 CTP 产品上运行大型生产项目。我已经开始玩它了,因为一旦它获得动力,MemCached 甚至无法与那些锁定在 Windows 世界中的人相比! http://blogs.msdn.com/velocity/

.NET 缓存: 没有理由打折标准 .NET 缓存。它是内置的,可以免费使用,无需(主要)设置。它通过提供将项目存储在本地内存、单一状态服务器或集中式数据库中的机制来提供灵活性。当您需要多个状态服务器(内存中的缓存)并且不想使用慢速数据库来保存缓存时,Velocity 介入的地方。

企业应用程序块:我远离所有企业应用程序块。它们是重型框架,提供的功能超出了我通常的要求!只要您记得包装所有涉及到不属于您自己的代码的内容并遵循简单的编码规则,就可以坚持使用其他任何一种方法!(当然只是我的看法——MySpace 尽可能多地利用企业应用程序块!)

您不必预先选择! 我通常会创建一个缓存包装器,在我的代码中与 Get、Set、Exists、Remove、ListKeys 等方法进行通信。然后它指向可以指向 MemCached、Velocity 或 .NET 的底层缓存抽象级别缓存。我使用 StructureMap(或选择另一个 IoC 容器)来注入我想在给定环境中使用哪种形式的缓存。在我的本地开发框中,我可能会在会话中使用 .NET 缓存。在生产中,我通常使用 MemCached Win 32。但无论它是如何设置的,您都可以轻松地交换东西以尝试每个系统,看看哪种系统最适合您。您只需要确保您的应用程序尽可能少地了解事物的缓存方式!一旦这个抽象层到位,您就可以对所有进出缓存的数据运行压缩算法 (gzip),这将允许您在缓存中存储 10 倍的数据量。-透明地

如果您有兴趣,我会在我的书中介绍 .NET 缓存、MemCached Win32、StructureMap 和适当的抽象!

ASP.NET 3.5 社交网络(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 ) 安德鲁·西默 www.andrewsiemer.com blog.andrewsiemer.com www.socialnetworkingin.net

更新 更改了列出使用 memcached 的站点的链接。谢谢大卫注意到它坏了!

于 2009-06-11T22:21:21.470 回答
3

请记住,EntLib 文档专门引导您使用 ASP.NET 应用程序的 ASP.NET 缓存。这可能是在这里使用它的最强烈建议。另外,EntLib 缓存没有依赖项,这对我来说是不使用它的一个重要原因。

我不认为将 System.Web 作为您的应用程序的一部分提供这样的技术限制,尽管他们将通知放在 .NET 3.5 页面上有点奇怪。Hanselman 实际上说他开始被这个想法吓到了,但后来被说服了。此外,如果您阅读评论,他说该块有太多移动部件,而 ASP.NET 缓存更轻量级。
我认为这正是Velocity将要解决的问题,但这只是目前的预览:-(

我会说使用 Web.Caching 看看你是怎么做的。如果您在其顶部放置某种抽象层,则以后如果发现问题,您总是可以选择将其换成 EntLib 块。

于 2008-08-22T09:37:44.507 回答
2

看看memcached。它是一个非常酷、快速、轻量级的分布式缓存系统。有几种最流行的语言的 API,包括 C#。它在客户端可能无法很好地服务(除非客户端当然是从某种服务器获取缓存数据),但是如果您将 memcached 的使用抽象到特定接口,则可以使用另一个缓存来实现该接口系统。

于 2008-08-22T06:21:15.930 回答
-2

@大卫·沃斯蒂

“如果他们把它放在网络命名空间中,我认为这是有充分理由的。” 相同的逻辑是否适用于机器人工作室中的并发和协调运行时 (CCR)?不?不这么认为。

于 2008-10-23T00:28:11.167 回答