You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:01:11