Esempio n. 1
0
        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
            };
        }
Esempio n. 2
0
        /// <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);
        }