Microsoft ASP.NET 输出缓存 提供在指定的持续时间内缓存 ASP.NET 页面或用户控件的呈现内容的功能。 这允许您的 ASP.NET 应用程序为来自缓存的所有后续请求提供服务,而不是重新呈现和重新执行页面。
你添加 <% @OutputCache %> 页面上的指令以使用 ASP.NET 输出缓存。
|
1 2 |
<%@Page … %> <%@OutputCacheDuration="duration"VaryByParam="paramList"%> |
关键精华
克服了进程内限制: 替换默认的进程内缓存,以绕过各个 Azure Web 角色的内存限制。
确保高可用性: 通过使用具有内置复制功能的分布式存储,防止 Azure 维护回收期间数据丢失。
支持无状态扩展: 消除负载均衡实例间的冗余缓存副本,使 Web 角色保持完全无状态。
消除数据库瓶颈: 通过直接从高性能缓存层处理频繁、繁重的页面请求,显著降低后端负载。
ASP.NET 输出缓存是一项非常有用的功能,尤其适用于页面访问频率远高于页面更新频率,且需要从缓存中提供服务的情况。它通过避免页面重复执行来提升应用程序性能,并减少昂贵的数据库访问次数,尤其是在页面涉及大量繁重数据库操作时。这有助于构建无状态架构,而无状态架构是 Azure 横向扩展的先决条件,因为它将内存负担从应用程序服务器转移到专用的缓存层。通过缓存这些响应,您可以消除通常在处理数百万个涉及大量 I/O 操作的页面请求时出现的数据库可扩展性瓶颈。
Azure Web 角色中进程内 (InProc) 输出缓存的挑战
当您在 Microsoft Azure 中使用输出缓存时,默认情况下,页面输出将作为 InProc 存储在您的 Microsoft Azure Web 角色中。 第一个问题是它将您限制在 Web 角色实例上可用的内存,当您缓存大量页面输出数据时,这可能会产生内存不足的问题。 另一个问题是您的应用程序在多个负载平衡的 Microsoft Azure Web 角色实例上运行。 下一个请求可能会转到另一个 Web 角色实例,该实例也会在此实例中创建 ASP.NET 输出缓存数据的新副本。 每个 Web 角色实例中的这些页面输出的冗余副本会消耗大量额外的内存。
Microsoft Azure Web 角色实例也非常频繁地回收以进行维护和修补。 发生这种情况时,所有页面输出都将丢失,您必须重新执行所有页面以重新填充页面输出缓存,这会对您的 Azure 应用程序的性能产生负面影响。
如何解决 Microsoft Azure 中的输出缓存问题?
在 Microsoft Azure 中解决所有这些问题的一种方法是使用分布式缓存,它在进程外运行并且是所有 Microsoft Azure Web 角色实例的公共存储。 ASP.NET 4.0 引入了一个可扩展点,可帮助开发人员使用他们选择的任何分布式缓存作为其 ASP.NET 输出缓存存储。
| 约束 | 进程内(默认) | NCache (分布式) |
|---|---|---|
| 存储容量 | 仅限 Web 角色 RAM | 可扩展集群内存 |
| 实例依赖关系 | 每个 Web 角色都有冗余副本 | 统一共享存储 |
| 回收利用的影响 | 角色维护期间数据丢失 | 通过复制实现持久化 |
| 卓越 | 导致出现“粘性”实例 | 启用无状态 Web 角色 |
分布式缓存由所有 Microsoft Azure Web 角色共享以用于页面输出,因此不会在各个 Web 角色实例中创建冗余副本。 Microsoft Azure Web 角色变得完全无状态,因此在回收 Web 角色时数据永远不会丢失。 通过将所有缓存服务器的内存资源集中在一起,您可以在分布式缓存中缓存大量数据。 此外,分布式缓存减少了数据库的负载,因为您不必在每个 Microsoft Azure Web 角色实例中分别执行涉及数据库调用的页面执行。
NCache Azure 是一个 .NET 的内存中分布式缓存 部署在 Microsoft Azure 云中的应用程序。 NCache Azure 已经实现了 ASP.NET 输出缓存提供程序,您可以使用它来存储 ASP.NET 页面输出并解决上述所有问题。 此外,部署 NCache 作为一个 Azure 缓存服务 通过复制提供数据可靠性并提高应用程序的可扩展性。
使用方法 NCache Azure ASP.NET 输出缓存提供程序
您可以使用 NCache Azure 用于在 ASP.NET 中进行输出缓存,如下所示,无需对 Microsoft Azure 应用程序进行任何代码更改。
第三步: 添加参考 NCache 用于 Azure 输出缓存提供程序程序集。
文件:web.config
|
1 2 3 4 5 6 |
<compilation debug="true " targetframework="4.0"> <assemblies> <add assembly="Alachisoft.NCache.OutputCache,Version=x.x.x.x,Culture=neutral"> </add></assemblies> </compilation> |
第三步: 立即注册 NCache 对于 Azure 输出缓存提供程序下配置> 部分并提供缓存设置。
文件:web.config
|
1 2 3 4 5 6 7 8 |
<caching> <outputcache defaultprovider="NOutputCacheProvider"> <providers> <add name="NOutputCacheProvider" type="NCOutputCache.NOutputCacheProvider" exceptionsenabled="true" enablelogs="false" cachename="mypartitionofReplicaCache"> </add></providers> </outputcache> </caching> |
第三步: 在要缓存的页面上添加 ASP.NET 输出缓存指令。
|
1 |
<%@OutputCacheVaryByParam="ProductCategory"Duration="300"%> |
NCache Azure ASP.NET 输出缓存功能
NCache for Azure 提供了一组丰富的功能,用于缓存和管理 Microsoft Azure 的输出缓存。 以下是它们的列表:
- 指定页面输出的持续时间: NCache for Azure 允许您指定要缓存 ASP.NET 页面输出的持续时间。
- 缓存不同版本的页面: NCache 对于 Azure,您可以根据各种 ASP.NET 输出缓存指令(例如 VaryByParam、VaryByCustom、VaryByControl)缓存不同版本的页面。 如果为页面请求接收到不同的参数,则将另一个版本的页面输出存储在分布式缓存中。
- 缓存页面的不同部分: 您还可以仅指定页面的一部分而不是缓存整个页面。 这适用于您仅缓存页面的静态部分并保留在运行时呈现的动态部分的情况。
- 为 ASP.NET 输出缓存实现自定义挂钩: NCache for Azure 允许您为页面输出实现和注册自定义挂钩(接口)。 这是为您的页面输出附加一些扩展属性,例如 NCache 用于 Azure 数据库依赖项、标记、组等。
结语
如您所见,分布式缓存允许您缓存 ASP.NET 页面输出,从而解决了多个负载平衡 Azure Web 角色的应用程序问题。 NCache 是一个 Azure ASP.NET 输出缓存提供程序,有助于提高 ASP.NET 应用程序的性能、可扩展性和可靠性。通过利用 NCacheAzure 部署的应用程序每秒可以处理数百万个请求,同时保持亚毫秒级的延迟,从而有效地消除数据库作为大容量内容交付的单点故障。
常见问题
问:为什么在负载均衡的 Azure 环境中,默认的 ASP.NET 输出缓存效率低下?
答:默认情况下,输出缓存存储在进程内 (InProc) 环境中。在负载均衡架构中,每个 Web 角色实例都维护着自己独立的缓存,这会导致内存冗余消耗,并造成不同服务器实例之间的数据不一致。
问:怎么做 NCache 防止 Azure Web 角色维护期间缓存丢失?
答: NCache 它作为独立于 Web 角色进程的分布式服务运行,因此在 Azure 实例因修补程序而回收时不会受到影响。其内置的数据复制功能可确保页面输出在整个集群中保持高可用性。
问:可以用吗 NCache 如何在不重写 ASP.NET 应用程序的情况下实现输出缓存?
答:是的。 NCache 利用 ASP.NET 4.0 可扩展性提供程序模型。集成完全通过 web.config 设置进行处理,方法是注册…… NCache 输出缓存提供程序,无需对实际页面逻辑或 C# 代码进行任何更改。
问:有 NCache 是否支持缓存页面的特定部分而不是整个页面输出?
答:是的, NCache 支持片段缓存。这允许您选择性地缓存页面的静态部分,同时允许动态部分在运行时渲染,从而优化混合内容类型页面的性能。






