【问题标题】:System.Web.Caching vs. Enterprise Library Caching BlockSystem.Web.Caching 与 Enterprise Library 缓存块
【发布时间】:2010-09-06 12:25:45
【问题描述】:

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

  • 你用什么?
  • 为什么?

System.Web.Caching

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

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

Enterprise Library Caching Application Block

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

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

Memcached for Win32 + .NET client

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

【问题讨论】:

    标签: caching .net-2.0 memcached enterprise-library


    【解决方案1】:

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

    MemCached Win32 速度 .net 缓存 企业库缓存应用程序块

    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 Cache、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) Andrew Siemer www.andrewsiemer.com blog.andrewsiemer.com www.socialnetworkingin.net

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

    【讨论】:

    • 您的书是否描述了您提到的缓存包装层?
    • 它讨论了包装器的概念。我认为我在那里包装了缓存,但我不确定我得到的 MemCached 有多深。不过,您可以在包装器后面使用 Enyim MemCached 客户端。但是,既然 MS Velocity 已经出现,您可能希望围绕 Velocity 制作一个更智能的包装器(它具有 MemCached 所没有的大量功能。如果您在 MS 堆栈上,那么 Velocity 就不会出错。
    • 我知道这是一个相当陈旧的答案,但是到 Memcached 流量站点的链接已损坏 (404)。很好的答案!
    • 大卫 - 我修复了断开的链接!感谢收看。
    【解决方案2】:

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

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

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

    【讨论】:

    • 值得注意的是,在 .NET 4.0 中,他们将缓存位移出 System.Web 专门用于解决此问题。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      @大卫·沃斯蒂

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

      【讨论】:

      • 这是我听过的最糟糕/最弱的论点。缓存很可能是由 asp.net 团队实现的,因为在 Web 场景中确实需要它,这就是它最终出现在该命名空间中的原因。然而,作为他们的聪明人,他们在没有任何依赖 IIS 的情况下构建了它。它应该只是移动到 system.caching 命名空间。
      猜你喜欢
      • 2013-05-25
      • 2012-01-21
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      相关资源
      最近更新 更多