使用 Redis 分布式缓存
在云原生应用中,各自为战的各个团队根据自己的计划使用他们喜欢的技术构建微服务。 这些微服务通常各自完全独立运行。 它们可能受益于缓存,但如果它们运行单独的缓存,它们可能无法实现最佳性能改进。 如果你为多个微服务提供单个缓存,这些服务可以从该缓存中检索另一个微服务存储的信息。
假设你是一家户外装备零售商的员工。 你决定在购物车微服务中使用 Redis 服务器实现缓存。 但是,还希望确保其他微服务也可以使用你缓存的信息。
在本单元中,你将了解分布式 Redis 缓存如何优化应用中多个微服务的性能。 你还将了解 .NET Aspire 如何帮助轻松实现分布式缓存。
什么是分布式缓存?
分布式缓存是在多个调用服务之间共享的缓存。 在云原生应用程序中,调用服务通常是微服务。 在分布式缓存中存储一些信息(例如目录中热门产品的详细信息)时,应用中的所有微服务都可以使用这些信息并获得性能改进。
在 .NET Aspire 中设置分布式缓存
若要使用分布式缓存,需要在应用主机项目和使用缓存的微服务中进行更改。
配置应用托管进程
在解决方案的应用应用托管进程项目中,首先安装分布式缓存托管组件:
dotnet add package Aspire.Hosting.Redis --prerelease
或者,可以使用 Visual Studio 中的“添加”>“.NET Aspire 组件”快捷方式从 NuGet 包管理器安装组件:
安装托管组件后,应用托管进程的 Program.cs 文件中的代码将注册缓存并将其传递给使用缓存的项目:
// Register the cache
var redis = builder.AddRedis("redis");
// Initiate the consuming project and pass the cache
builder.AddProject<Projects.ConsumingProject>()
.WithReference(redis);
配置消耗项目
若要在微服务中安装 .NET Aspire 分布式缓存组件,请在 .NET Aspire 项目中使用如下命令:
dotnet add package Aspire.StackExchange.Redis.DistributedCache --prerelease
同样,也可以选择使用 NuGet 包管理器安装组件:
使用分布式缓存
在想要使用缓存的任何项目中,必须获取一个分布式缓存对象,该对象表示与 Redis 的连接。 在 Program.cs 文件中,此代码将注册分布式缓存:
builder.AddRedisDistributedCache("cache")
在消耗项目中注册缓存后,随时可以使用依赖项注入来检索分布式缓存:
public class MyService(IDistributedCache cache)
{
public async Task InitializeAsync()
{
// Check if there is cached content
var cachedInfo = await cache.GetAsync("myinfo")
if (cachedInfo is null)
{
// There's no content in the cache so formulate it here
// For example, query databases.
// Store the content in the cache
await cache.SetAsync("myinfo", cachedInformation, new()
{ AbsoluteExpiration = DateTime.Now.AddSeconds(60) }
);
}
}
}
配置
若要使微服务连接到 Redis 分布式缓存,必须通过提供连接字符串来告知它们该缓存所在的位置。 上述对 AddRedisDistributedCache()
方法的调用指定了名为 redis
的连接字符串。
使用配置文件(例如 appsettings.json)中的 ConnectionStrings
部分配置连接字符串:
{
"ConnectionStrings": {
"redis": "redis.contoso.com:6379"
}
}
你还可以使用 appsettings.json 来配置分布式缓存组件的行为。 例如,此代码将连接配置为在 5 秒后超时,然后重试三次:
{
"Aspire": {
"StackExchange": {
"Redis": {
"ConfigurationOptions": {
"ConnectTimeout": 5000,
"ConnectRetry": 3
}
}
}
}
}
你还可以在 AddRedisDistributedCache()
方法上使用内联委托来配置连接。 此代码配置的属性与前面的 JSON 示例相同:
builder.AddRedisDistributedCache(
"redis",
configureOptions: options => options.ConnectTimeout = 5000
);