使用 Redis 输出缓存
为复杂请求构造返回给客户端的 HTML 可能需要一段时间,并需要对多个微服务进行查询。 此 HTML 或其他输出代码是缓存的常见候选项。
假设你是一家户外装备零售商的员工。 你的新 Web 应用包含一个微服务,用于构造用户界面并将 HTML 返回到浏览器。 你想要确保它以最佳方式执行。
在本单元中,你将了解输出缓存以及如何使用 Redis 和 .NET Aspire 在微服务中实现它。
什么是输出缓存?
如果要在 Web 应用中存储完整的 HTML 页面,或者在最小 API 中存储较小的输出部分,请使用输出缓存。 可以通过缓存经常请求的页面(例如应用的主页)来获得最佳性能改进。
在 .NET Aspire 中设置输出缓存
安装和配置步骤与分布式缓存组件相同,只不过要在消耗项目中安装输出缓存组件。
配置应用托管进程
在应用托管进程中,安装与用于分布式缓存相同的 Redis 托管组件:
dotnet add package Aspire.Hosting.Redis --prerelease
注册代码完全相同。 你只需添加以下代码(如果尚未为分布式缓存添加此代码):
// Register the cache
var redis = builder.AddRedis("redis");
// Initiate the consuming project and pass the cache
builder.AddProject<Projects.ConsumingProject>()
.WithReference(redis);
配置消耗项目
在微服务项目中,添加 Redis 输出缓存组件:
dotnet add package Aspire.StackExchange.Redis.OutputCaching
使用输出缓存
通常,消耗项目是生成应用的用户界面的微服务。 例如,它可能是 ASP.NET 或 Blazor Web 应用或最小 API。 必须将输出缓存添加到应用,然后将中间件添加到项目,如下所示:
// Add the output cache
builder.AddRedisOutputCache();
// Build the app
var app = builder.Build();
// Add the middleware
app.UseOutputCache();
缓存完整页面
若要缓存页面,请使用 OutputCache
属性,例如在此 Razor 页中:
@page "/"
@attribute [OutputCache(Duration = 10)]
<PageTitle>Welcome to Contoso</PageTitle>
<h1>Welcome to Contoso</h1>
This is our homepage. The time is: @DateTime.Now
在最小 API 中缓存输出
最小 API 是快速实现 HTTP Web 服务的项目。 它通过避开基架和不必要的控制器来缩小生成 RESTful API 所需的代码。 相反,API 操作和路由是直接声明的。
在此示例中,当用户请求产品 ID 时,将返回一个简单的响应:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/products/{ProdId}",
(int ProdId) => $"The product ID is {ProdId}.");
app.Run();
若要缓存此响应,请调用 CacheOutput()
方法,或在 MapGet
调用中应用 OutputCache
属性:
app.MapGet("/products/{ProdId}", (int ProdId) => $"The product ID is {ProdId}.").CacheOutput();
app.MapGet("/products/{ProdId}", [OutputCache] (int ProdId) => $"The product ID is {ProdId}.");