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

  • 你用什么?
  • 为什么?

系统.Web.缓存

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

我不期望使用它的亮点之一, SqlCache依赖项, ,但添加 缓存项更新回调 在 .NET 3.5 中似乎是一件非常好的事情。

企业库缓存应用程序块

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

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

Win32 的 Memcached + .NET客户端

当你不需要时有什么优点和缺点 分散式 缓存?

有帮助吗?

解决方案

以下是我针对缓存主题考虑的项目:

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

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

速度: 这是微软对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 的站点的链接。谢谢大卫注意到它坏了!

其他提示

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

我不认为将 System.Web 作为应用程序的一部分进行交付存在技术限制,尽管他们将该通知放在 .NET 3.5 页面上有点奇怪。汉塞尔曼实际上说他一开始对这个想法感到害怕,但后来被说服了。另外,如果您阅读评论,他会说该块有太多移动部件,而 ASP.NET 缓存要轻量得多。
我认为这正是这样的问题 速度 将会解决,但这只是现在的预览:-(

我建议使用 Web.Caching 并看看你进展如何。如果您在其顶部放置某种抽象层,那么当您发现问题时,您始终可以选择将其替换为 EntLib 块。

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

@达维德·沃斯蒂

"如果他们把它放在网络命名空间里 我想这是有原因的" 同样的逻辑是否也适用于机器人工作室的并发与协调运行时(CCR)?不?不这么认为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top