.NET Core中StackExchange.Redis的Redis哨兵模式配置疑问
正确配置StackExchange.Redis对接Redis哨兵集群
核心结论
你之前的理解有误:必须在应用中配置哨兵相关信息,不能只填主从节点地址。如果直接连主从,当哨兵完成故障切换选举出新主节点后,你的应用会继续尝试连接旧主节点,导致写入失败——哨兵的作用就是让应用能自动感知主节点变化,这需要应用通过哨兵来获取当前主节点地址。
关于ServiceName的含义
ServiceName就是你Redis哨兵集群中监控的主服务名称,也就是你在哨兵配置文件里用sentinel monitor指令指定的名称(比如sentinel monitor mymaster 172.10.10.10 6379 2中的mymaster)。StackExchange.Redis通过这个名称向哨兵请求当前集群的主节点地址,同时监听哨兵的节点变更通知,自动更新连接的主节点。
两种正确配置方式
1. 原生StackExchange.Redis直接使用
直接调用ConnectSentinel方法,传入哨兵节点配置和服务名称:
var sentinelOptions = new ConfigurationOptions { // 填写所有哨兵节点的地址 EndPoints = { "172.10.10.10:26379", "172.10.10.11:26379", "172.10.10.12:26379" }, // 对应哨兵监控的主服务名称 ServiceName = "mymaster", Password = "pass", // 其他可选配置:连接超时、同步超时等 ConnectTimeout = 5000, SyncTimeout = 1000 }; // 通过哨兵创建连接多路复用器 var multiplexer = ConnectionMultiplexer.ConnectSentinel(sentinelOptions); var db = multiplexer.GetDatabase();
2. 结合.NET Core依赖注入(使用Microsoft.Extensions.Caching.StackExchangeRedis)
在appsettings.json中配置连接字符串,格式为哨兵节点列表+ServiceName参数:
{ "RedisCacheOptions": { "Configuration": "172.10.10.10:26379,172.10.10.11:26379,172.10.10.12:26379,password=pass,servicename=mymaster", "InstanceName": "MyAppCache:" } }
然后在Program.cs中注册Redis缓存服务:
builder.Services.AddStackExchangeRedisCache(options => { options.Configuration = builder.Configuration["RedisCacheOptions:Configuration"]; options.InstanceName = builder.Configuration["RedisCacheOptions:InstanceName"]; });
关键注意事项
- 不要直接填写主从节点地址,必须填写哨兵节点的地址(默认哨兵端口是26379,不是Redis服务的6379/5660)
ServiceName必须和哨兵配置中的主服务名称完全一致,否则哨兵无法返回正确的主节点- 你当前使用的包版本(StackExchange.Redis 2.6.70 + Microsoft.Extensions.Caching.StackExchangeRedis 6.0.10)是兼容的,无需升级
内容的提问来源于stack exchange,提问作者user20427760
相关产品推荐
相关产品推荐

