ASP .NET Core 8高效集成Redis缓存实战
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 服务
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数据库
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");}
}