private RedisOption _option; // 选项配置 #endregion #region 构造与析构 /// <summary> /// 实例化 /// </summary> /// <param name="option">配置</param> public RedisClient(RedisOption option) { _option = new RedisOption() { Server = ObjectCheck.IsNullOrEmpty(option.Server) ? "127.0.0.1" : option.Server, Port = option.Port <= 0 ? 6379 : option.Port, Password = option.Password, Db = option.Db < 0 ? 0 : option.Db, ConnectTimeout = option.ConnectTimeout, SendTimeout = option.SendTimeout, ReceiveTimeout = option.ReceiveTimeout, RetryCount = option.RetryCount }; }
/// <summary> /// 执行命令 /// </summary> /// <param name="cmd"></param> /// <returns></returns> private IList <object> Execute(RedisCommand cmd) { var i = 0; do { var conn = Cache.Get(); // 从缓存中取出连接 try { // 初始化连接 conn.Initialize(_option); // 连接到数据库 if (!IsLogined) { // 关闭连接 conn.Close(); // 验证密码 if (!ObjectCheck.IsNullOrEmpty(_option.Password)) { var val = conn.Execute(new RedisCommand(Commands.Auth, _option.Password)); } // 选择数据库 if (_option.Db > 0) { var val = conn.Execute(new RedisCommand(Commands.Select, _option.Db)); } // 登录成功 IsLogined = true; LoginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); } // 执行命令 return(conn.Execute(cmd)); } catch (RedisServerException e) { // 如果由RedisServerException引发异常,说明成功连接到了服务器 if (e.Message.IndexOf("AUTH", StringComparison.InvariantCulture) < 0) { // 如果服务器的应答不是登录验证问题,说明客户端操作出现了问题,此时不用再重试 throw new RedisServerException(e.Message); } else { // 如果服务器的应答是登录验证问题,则此时必须变更登录状态,重新进行登录验证 IsLogined = false; LoginTime = ""; if (i++ >= _option.RetryCount) // 超过重试次数 { throw new RedisClientException(e, MethodBase.GetCurrentMethod()); } } } catch (RedisClientException e) { // 如果网络存已经关闭,则必须重新登录 if (conn != null && !conn.IsConnected()) // 连接已断开必须重新登录 { IsLogined = false; LoginTime = ""; } // 如果服务器的应答要求登录验证,则必须重新登录 if (e.Message.IndexOf("NOAUTH", StringComparison.InvariantCulture) >= 0) { IsLogined = false; LoginTime = ""; } // 超过重试次数 if (i++ >= _option.RetryCount) { throw new RedisClientException(e, MethodBase.GetCurrentMethod()); } } catch (Exception e) { // 如果由系统引发异常,不能识别 throw new RedisClientException(e, MethodBase.GetCurrentMethod()); } finally { Cache.Put(conn); // 回收连接 } } while (true); }