Redis 最常用的功能是作为高性能的 分布式缓存 ,替代默认的内存缓存(IMemoryCache
),适用于多服务器部署的场景。
1、安装Redis Nuget包
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
2、在appsettings.json中添加redis配置项
{
"RedisConfig": {
"Connection": "localhost:6379",
"Password": "",
"InstanceName": "BackendManagement:",
"DefaultDatabase": 0
}
}
3、创建redis配置项对象
/// <summary>
/// redis配置信息
/// </summary>
public class RedisConfig
{
/// <summary>
/// 连接字符串
/// </summary>
public string Connection { get; set; } = string.Empty;
/// <summary>
/// 密码
/// </summary>
public string Password { get; set; } = string.Empty;
/// <summary>
/// 实例名
/// </summary>
public string InstanceName { get; set; } = string.Empty;
/// <summary>
/// 默认数据库索引
/// </summary>
public int DefaultDatabase { get; set; }
}
4、在 Program.cs 中配置 Redis 服务
cs
var builder = WebApplication.CreateBuilder(args);
RedisConfig? redisConfig = builder.Configuration.GetSection("RedisConfig").Get<RedisConfig>();
if (redisConfig != null)
{
builder.Services.AddSingleton(redisConfig);
builder.Services.AddSingleton<IConnectionMultiplexer>(sp =>
{
var configuration = ConfigurationOptions.Parse(redisConfig.Connection);
configuration.AbortOnConnectFail = false; // 不要立即失败
configuration.ConnectTimeout = 5000; // 5秒连接超时
configuration.SyncTimeout = 5000; // 5秒操作超时
configuration.ReconnectRetryPolicy = new ExponentialRetry(1000); // 重试策略
if (!string.IsNullOrEmpty(redisConfig.Password))
{
configuration.Password = redisConfig.Password;
}
var multiplexer = ConnectionMultiplexer.Connect(configuration);
// 注册应用程序关闭时的清理
var lifetime = sp.GetRequiredService<IHostApplicationLifetime>();
lifetime.ApplicationStopping.Register(() =>
{
multiplexer.Close();
multiplexer.Dispose();
});
return multiplexer;
});
builder.Services.AddSingleton<IDatabase>(sp =>
{
var multiplexer = sp.GetRequiredService<IConnectionMultiplexer>();
return multiplexer.GetDatabase(redisConfig.DefaultDatabase);
});
}
else
{
Log.Error("RedisConfig is empty.");
}
var app = builder.Build();
5、使用redis数据库
cs
public class RedisService
{
private readonly IDatabase _redisDB;
public RedisService(IDatabase redisDB)
{
_redisDB = redisDB;
}
public async Task PerformOperations()
{
await _redisDB.StringSetAsync("mykey", "myvalue");
var value = await _redisDB.StringGetAsync("mykey");
}
}