如果部署哨兵模式,使用c#代码连接到哨兵集群,获取相关信息。有非常小的几率出现2个master的情况。
try
{ string[] connArry = ConnectionString.Split(';'); string[] ips = connArry[0].Split(','); ConfigurationOptions option = new ConfigurationOptions(); option.ServiceName = connArry[2].Replace("servername=", ""); foreach (string item in ips) option.EndPoints.Add(item); //这行在sentinel模式必须加上 option.TieBreaker = ""; option.CommandMap = CommandMap.Sentinel; //连接上去 ConnectionMultiplexer conn = ConnectionMultiplexer.Connect(option); //然后得到相应服务器 SortedList<string, int> masters = new SortedList<string, int>(); foreach (string item in ips) { //循环所有的哨兵服务器,然后得到master地址,放在一个list IServer server = conn.GetServer(item); EndPoint temp = server.SentinelGetMasterAddressByName("master"); //判断存在则次数+1 if (masters.Count(m => m.Key == temp.ToString()) > 0) { KeyValuePair<string, int> data = masters.Where(m => m.Key == temp.ToString()).Single(); masters.Remove(data.Key); masters.Add(data.Key, data.Value + 1); } else { masters.Add(temp.ToString(), 1); } } //拿到哨兵中master ip最多的master KeyValuePair<string, int> master = masters.OrderBy(m => m.Value).Single(); //然后正式开始连接上master _connMultiplexer = ConnectionMultiplexer.Connect(string.Format("{0},{1}", master.Key, connArry[1])); _db = _connMultiplexer.GetDatabase(CommonHelper.RedisDB); Console.WriteLine("Initialize Redis Connetion Success..."); return true; } catch (Exception ex) { Console.WriteLine("Initialize Redis Connetion Failure:" + ex.Message); LogHelper.Error(ex); return false; }
部署redis集群后,StackExchange.Redis可以自动识别主库,所以不需要自己去获取主库地址,如果使用单例连接,那么出现连接异常,只需要拦截下来进行重试几次即可,我这里基于polly做了一个重试机制,当然你也可以写for循环来实现重试也没有什么不可以的。
代码地址:https://gitee.com/awith/RedisHelper.git