/// <summary>
        ///     连接到指定的Sentinel,获取 master 和 slave 信息并返回。同时,注册相应的事件用于接收 sentinel 的通知消息
        /// </summary>
        /// <returns></returns>
        public string Start()
        {
            var redisConnectionString = string.Empty;

            try
            {
                // redis在哨兵模式下,如果Password不为null 或 "",会使用 AUTH 命令,但这个命令是不可用的。
                // 所以,克隆一个配置,并将其 Password信息去除
                ConfigurationOptions finalSentinalConfig = SentinelConfig;
                if (!string.IsNullOrWhiteSpace(SentinelConfig.Password))
                {
                    var cloneConfig = SentinelConfig.Clone();
                    cloneConfig.Password = "";
                    finalSentinalConfig  = cloneConfig;
                }
                SentinelConnection = ConnectionMultiplexer.Connect(finalSentinalConfig);

                redisConnectionString = GetConnectionStringFromSentinel();

                _Sentinelsub = SentinelConnection.GetSubscriber();

                _Sentinelsub.SubscribeAsync("+switch-master", (channle, msg) =>
                {
                    redisConnectionString = GetConnectionStringFromSentinel();
                    RaiseOnRedisServerChanged(_Section, redisConnectionString, PoolSize);
                });
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("SESentinelClient.Start 连接到哨兵服务器({0})失败:{1}", SentinelConfig, ex.Message));
            }

            return(redisConnectionString);
        }
 /// <summary>
 /// 初始化哨兵类
 /// </summary>
 /// <param name="section"></param>
 /// <param name="connectionStr"></param>
 /// <param name="poolSize"></param>
 /// <param name="password"></param>
 public SESentinelClient(string section, string connectionStr, int poolSize, string password)
 {
     if (SentinelConnection != null)
     {
         SentinelConnection.Dispose();
     }
     _Section                  = section;
     SentinelConfig            = ConfigurationOptions.Parse(connectionStr);
     SentinelConfig.TieBreaker = string.Empty;
     SentinelConfig.CommandMap = CommandMap.Sentinel;
     PoolSize                  = poolSize;
     _password                 = password;
 }
        /// <summary>
        ///     根据当前哨兵获取对应redis实例的连接字符串
        /// </summary>
        /// <returns></returns>
        private string GetConnectionStringFromSentinel()
        {
            try
            {
                var activeSentinelServer = GetActiveServer(SentinelConnection, SentinelConnection.GetEndPoints());
                var masterConnectionInfo = activeSentinelServer.SentinelGetMasterAddressByName(SentinelConfig.ServiceName);
                var slaveConnectionInfos =
                    SanitizeHostsConfig(activeSentinelServer.SentinelSlaves(SentinelConfig.ServiceName));

                var redisConfigs = new ConfigurationOptions
                {
                    AllowAdmin         = true,
                    DefaultDatabase    = SentinelConfig.DefaultDatabase,
                    ConnectRetry       = SentinelConfig.ConnectRetry,
                    ConnectTimeout     = SentinelConfig.ConnectTimeout,
                    KeepAlive          = SentinelConfig.KeepAlive,
                    SyncTimeout        = SentinelConfig.SyncTimeout,
                    AbortOnConnectFail = false
                };
                if (!string.IsNullOrEmpty(_password))
                {
                    redisConfigs.Password = _password;
                }
                redisConfigs.EndPoints.Add(masterConnectionInfo);
                foreach (var slaveInfo in slaveConnectionInfos)
                {
                    redisConfigs.EndPoints.Add(slaveInfo);
                }

                return(redisConfigs.ToString());
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("SESentinelClient.GetConnectionStringFromSentinel 连接到哨兵服务器({0})失败:{1}", SentinelConfig, ex.Message));
            }
        }