使用 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}.");

了解详细信息