Browse Source

Redis事件

懒得勤快 7 years ago
parent
commit
dfb5015ada

+ 1 - 1
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <TargetFramework>netcoreapp2.0</TargetFramework>
-    <Version>1.9.1</Version>
+    <Version>1.9.1.1</Version>
     <Authors>懒得勤快</Authors>
     <Company>masuit.com</Company>
     <Description>包含一些常用的操作类,大都是静态类,加密解密,反射操作,硬件信息,字符串扩展方法,日期时间扩展操作,大文件拷贝,图像裁剪,html处理,验证码、NoSql等常用封装。

+ 0 - 134
Masuit.Tools.Core/NoSQL/RedisConnectionHelp.cs

@@ -1,134 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using StackExchange.Redis;
-
-namespace Masuit.Tools.Core.NoSQL
-{
-    /// <summary>
-    /// ConnectionMultiplexer对象管理帮助类
-    /// </summary>
-    public static class RedisConnectionHelp
-    {
-        /// <summary>
-        /// Redis服务器连接字符串,默认为:127.0.0.1:6379,allowadmin=true,如:<br/>
-        /// </summary>
-        public static string RedisConnectionString => "127.0.0.1:6379,allowadmin=true";
-
-        private static readonly object Locker = new object();
-        private static ConnectionMultiplexer _instance;
-        private static readonly ConcurrentDictionary<string, ConnectionMultiplexer> ConnectionCache = new ConcurrentDictionary<string, ConnectionMultiplexer>();
-
-        /// <summary>
-        /// 单例获取
-        /// </summary>
-        public static ConnectionMultiplexer Instance
-        {
-            get
-            {
-                if (_instance != null) return _instance;
-                lock (Locker)
-                {
-                    if (_instance == null || !_instance.IsConnected)
-                    {
-                        _instance = GetManager();
-                    }
-                }
-                return _instance;
-            }
-        }
-
-        /// <summary>
-        /// 缓存获取
-        /// </summary>
-        /// <param name="connectionString">连接字符串</param>
-        /// <returns>连接对象</returns>
-        public static ConnectionMultiplexer GetConnectionMultiplexer(string connectionString)
-        {
-            if (!ConnectionCache.ContainsKey(connectionString))
-            {
-                ConnectionCache[connectionString] = GetManager(connectionString);
-            }
-            return ConnectionCache[connectionString];
-        }
-
-        private static ConnectionMultiplexer GetManager(string connectionString = null)
-        {
-            connectionString = connectionString ?? RedisConnectionString;
-            var connect = ConnectionMultiplexer.Connect(connectionString);
-
-            //注册如下事件
-            connect.ConnectionFailed += MuxerConnectionFailed;
-            connect.ConnectionRestored += MuxerConnectionRestored;
-            connect.ErrorMessage += MuxerErrorMessage;
-            connect.ConfigurationChanged += MuxerConfigurationChanged;
-            connect.HashSlotMoved += MuxerHashSlotMoved;
-            connect.InternalError += MuxerInternalError;
-
-            return connect;
-        }
-
-        #region 事件
-
-        /// <summary>
-        /// 配置更改时
-        /// </summary>
-        /// <param name="sender">触发者</param>
-        /// <param name="e">事件参数</param>
-        private static void MuxerConfigurationChanged(object sender, EndPointEventArgs e)
-        {
-            Console.WriteLine("Configuration changed: " + e.EndPoint);
-        }
-
-        /// <summary>
-        /// 发生错误时
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e)
-        {
-            Console.WriteLine("ErrorMessage: " + e.Message);
-        }
-
-        /// <summary>
-        /// 重新建立连接之前的错误
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private static void MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e)
-        {
-            Console.WriteLine("ConnectionRestored: " + e.EndPoint);
-        }
-
-        /// <summary>
-        /// 连接失败 , 如果重新连接成功你将不会收到这个通知
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)
-        {
-            Console.WriteLine("重新连接:Endpoint failed: " + e.EndPoint + ", " + e.FailureType + (e.Exception == null ? "" : (", " + e.Exception.Message)));
-        }
-
-        /// <summary>
-        /// 更改集群
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private static void MuxerHashSlotMoved(object sender, HashSlotMovedEventArgs e)
-        {
-            Console.WriteLine("HashSlotMoved:NewEndPoint" + e.NewEndPoint + ", OldEndPoint" + e.OldEndPoint);
-        }
-
-        /// <summary>
-        /// redis类库错误
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private static void MuxerInternalError(object sender, InternalErrorEventArgs e)
-        {
-            Console.WriteLine("InternalError:Message" + e.Exception.Message);
-        }
-
-        #endregion 事件
-    }
-}

+ 151 - 54
Masuit.Tools.Core/NoSQL/RedisHelper.cs

@@ -2,10 +2,11 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
+using Masuit.Tools.Core.NoSQL;
 using Newtonsoft.Json;
 using StackExchange.Redis;
 
-namespace Masuit.Tools.Core.NoSQL
+namespace Masuit.Tools.NoSQL
 {
     /// <summary>
     /// Redis操作
@@ -14,15 +15,49 @@ namespace Masuit.Tools.Core.NoSQL
     {
         private int DbNum { get; }
         private readonly ConnectionMultiplexer _conn;
+
         /// <summary>
         /// 自定义键
         /// </summary>
         public string CustomKey;
 
+        /// <summary>
+        /// 连接失败 , 如果重新连接成功你将不会收到这个通知
+        /// </summary>
+        public event EventHandler<ConnectionFailedEventArgs> ConnectionFailed;
+
+        /// <summary>
+        /// 重新建立连接之前的错误
+        /// </summary>
+        public event EventHandler<ConnectionFailedEventArgs> ConnectionRestored;
+
+        /// <summary>
+        /// 发生错误时
+        /// </summary>
+        public event EventHandler<RedisErrorEventArgs> ErrorMessage;
+
+        /// <summary>
+        /// 配置更改时
+        /// </summary>
+        public event EventHandler<EndPointEventArgs> ConfigurationChanged;
+
+        /// <summary>
+        /// 更改集群时
+        /// </summary>
+        public event EventHandler<HashSlotMovedEventArgs> HashSlotMoved;
+
+        /// <summary>
+        /// redis类库错误时
+        /// </summary>
+        public event EventHandler<InternalErrorEventArgs> InternalError;
+
         #region 构造函数
 
         /// <summary>
-        /// 构造函数,使用该构造函数需要先配置链接字符串,连接字符串通过RedisConnectionHelp.RedisConnectionString属性进行获取,若未正确配置,将按默认值“127.0.0.1:6379,allowadmin=true”进行操作<br/>
+        /// 构造函数,使用该构造函数需要先在config中配置链接字符串,连接字符串在config配置文件中的ConnectionStrings节下配置,name固定为RedisHosts,值的格式:127.0.0.1:6379,allowadmin=true,若未正确配置,将按默认值“127.0.0.1:6379,allowadmin=true”进行操作,如:<br/>
+        /// &lt;connectionStrings&gt;<br/>
+        ///      &lt;add name = "RedisHosts" connectionString="127.0.0.1:6379,allowadmin=true"/&gt;<br/>
+        /// &lt;/connectionStrings&gt;
         /// </summary>
         /// <param name="dbNum">数据库编号</param>
         public RedisHelper(int dbNum = 0) : this(dbNum, null)
@@ -34,10 +69,16 @@ namespace Masuit.Tools.Core.NoSQL
         /// </summary>
         /// <param name="dbNum">数据库的编号</param>
         /// <param name="readWriteHosts">Redis服务器连接字符串,格式:127.0.0.1:6379,allowadmin=true</param>
-        public RedisHelper(int dbNum, string readWriteHosts)
+        public RedisHelper(int dbNum = 0, string readWriteHosts = "127.0.0.1:6379,allowadmin=true")
         {
             DbNum = dbNum;
-            _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? RedisConnectionHelp.Instance : RedisConnectionHelp.GetConnectionMultiplexer(readWriteHosts);
+            _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? RedisConnectionManager.Instance : RedisConnectionManager.GetConnectionMultiplexer(readWriteHosts);
+            _conn.ConfigurationChanged += ConfigurationChanged;
+            _conn.ConnectionFailed += ConnectionFailed;
+            _conn.ConnectionRestored += ConnectionRestored;
+            _conn.ErrorMessage += ErrorMessage;
+            _conn.HashSlotMoved += HashSlotMoved;
+            _conn.InternalError += InternalError;
         }
 
         /// <summary>
@@ -113,8 +154,12 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>值</returns>
         public string GetString(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(db => db.StringGet(key));
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                return Do(db => db.StringGet(key));
+            }
+            return string.Empty;
         }
 
         /// <summary>
@@ -136,8 +181,12 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>实例对象</returns>
         public T GetString<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(db => ConvertObj<T>(db.StringGet(key)));
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                return Do(db => ConvertObj<T>(db.StringGet(key)));
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -215,8 +264,12 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>值</returns>
         public async Task<string> GetStringAsync(string key)
         {
-            key = AddSysCustomKey(key);
-            return await Do(db => db.StringGetAsync(key));
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                return await Do(db => db.StringGetAsync(key));
+            }
+            return string.Empty;
         }
 
         /// <summary>
@@ -238,9 +291,13 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>实例对象</returns>
         public async Task<T> GetStringAsync<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            string result = await Do(db => db.StringGetAsync(key));
-            return ConvertObj<T>(result);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                string result = await Do(db => db.StringGetAsync(key));
+                return ConvertObj<T>(result);
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -339,12 +396,16 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>对象实例</returns>
         public T GetHash<T>(string key, string dataKey)
         {
-            key = AddSysCustomKey(key);
-            return Do(db =>
+            if (KeyExists(key))
             {
-                string value = db.HashGet(key, dataKey);
-                return ConvertObj<T>(value);
-            });
+                key = AddSysCustomKey(key);
+                return Do(db =>
+                {
+                    string value = db.HashGet(key, dataKey);
+                    return ConvertObj<T>(value);
+                });
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -456,9 +517,13 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>对象实例</returns>
         public async Task<T> GetHashAsync<T>(string key, string dataKey)
         {
-            key = AddSysCustomKey(key);
-            string value = await Do(db => db.HashGetAsync(key, dataKey));
-            return ConvertObj<T>(value);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                string value = await Do(db => db.HashGetAsync(key, dataKey));
+                return ConvertObj<T>(value);
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -528,12 +593,16 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>数据集</returns>
         public List<T> ListRange<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(redis =>
+            if (KeyExists(key))
             {
-                var values = redis.ListRange(key);
-                return ConvetList<T>(values);
-            });
+                key = AddSysCustomKey(key);
+                return Do(redis =>
+                {
+                    var values = redis.ListRange(key);
+                    return ConvetList<T>(values);
+                });
+            }
+            return new List<T>();
         }
 
         /// <summary>
@@ -556,12 +625,16 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>值</returns>
         public T ListRightPop<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(db =>
-             {
-                 var value = db.ListRightPop(key);
-                 return ConvertObj<T>(value);
-             });
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                return Do(db =>
+                {
+                    var value = db.ListRightPop(key);
+                    return ConvertObj<T>(value);
+                });
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -584,12 +657,16 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>对象实例</returns>
         public T ListLeftPop<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(db =>
+            if (KeyExists(key))
             {
-                var value = db.ListLeftPop(key);
-                return ConvertObj<T>(value);
-            });
+                key = AddSysCustomKey(key);
+                return Do(db =>
+                {
+                    var value = db.ListLeftPop(key);
+                    return ConvertObj<T>(value);
+                });
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -626,9 +703,13 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>数据集合</returns>
         public async Task<List<T>> ListRangeAsync<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            var values = await Do(redis => redis.ListRangeAsync(key));
-            return ConvetList<T>(values);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                var values = await Do(redis => redis.ListRangeAsync(key));
+                return ConvetList<T>(values);
+            }
+            return new List<T>();
         }
 
         /// <summary>
@@ -651,9 +732,13 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>对象实例</returns>
         public async Task<T> ListRightPopAsync<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            var value = await Do(db => db.ListRightPopAsync(key));
-            return ConvertObj<T>(value);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                var value = await Do(db => db.ListRightPopAsync(key));
+                return ConvertObj<T>(value);
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -676,9 +761,13 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>实例对象</returns>
         public async Task<T> ListLeftPopAsync<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            var value = await Do(db => db.ListLeftPopAsync(key));
-            return ConvertObj<T>(value);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                var value = await Do(db => db.ListLeftPopAsync(key));
+                return ConvertObj<T>(value);
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -730,12 +819,16 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>数据集合</returns>
         public List<T> SetRangeSortedByRank<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(redis =>
+            if (KeyExists(key))
             {
-                var values = redis.SortedSetRangeByRank(key);
-                return ConvetList<T>(values);
-            });
+                key = AddSysCustomKey(key);
+                return Do(redis =>
+                {
+                    var values = redis.SortedSetRangeByRank(key);
+                    return ConvetList<T>(values);
+                });
+            }
+            return new List<T>();
         }
 
         /// <summary>
@@ -783,9 +876,13 @@ namespace Masuit.Tools.Core.NoSQL
         /// <returns>数据集合</returns>
         public async Task<List<T>> SortedSetRangeByRankAsync<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            var values = await Do(redis => redis.SortedSetRangeByRankAsync(key));
-            return ConvetList<T>(values);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                var values = await Do(redis => redis.SortedSetRangeByRankAsync(key));
+                return ConvetList<T>(values);
+            }
+            return new List<T>();
         }
 
         /// <summary>

+ 1 - 1
Masuit.Tools/Masuit.Tools.csproj

@@ -101,7 +101,7 @@
     <Compile Include="Net\CookieHelper.cs" />
     <Compile Include="Net\FtpClient.cs" />
     <Compile Include="Net\SocketClient.cs" />
-    <Compile Include="NoSQL\RedisConnectionHelp.cs" />
+    <Compile Include="NoSQL\RedisConnectionManager.cs" />
     <Compile Include="NoSQL\RedisHelper.cs" />
     <Compile Include="Reflection\ReflectHelper.cs" />
     <Compile Include="Reflection\ReflectionUtil.cs" />

+ 0 - 140
Masuit.Tools/NoSQL/RedisConnectionHelp.cs

@@ -1,140 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using System.Configuration;
-using StackExchange.Redis;
-
-namespace Masuit.Tools.NoSQL
-{
-    /// <summary>
-    /// ConnectionMultiplexer对象管理帮助类
-    /// </summary>
-    public static class RedisConnectionHelp
-    {
-        /// <summary>
-        /// Redis服务器连接字符串,在config配置文件中的ConnectionStrings节下配置,name固定为RedisHosts,值的格式:127.0.0.1:6379,allowadmin=true,如:<br/>
-        /// &lt;connectionStrings&gt;<br/>
-        ///      &lt;add name = "RedisHosts" connectionString="127.0.0.1:6379,allowadmin=true"/&gt;<br/>
-        /// &lt;/connectionStrings&gt;
-        /// </summary>
-        public static readonly string RedisConnectionString = ConfigurationManager.ConnectionStrings["RedisHosts"]?.ConnectionString ?? "127.0.0.1:6379,allowadmin=true";
-
-        private static readonly object Locker = new object();
-        private static ConnectionMultiplexer _instance;
-        private static readonly ConcurrentDictionary<string, ConnectionMultiplexer> ConnectionCache = new ConcurrentDictionary<string, ConnectionMultiplexer>();
-
-        /// <summary>
-        /// 单例获取
-        /// </summary>
-        public static ConnectionMultiplexer Instance
-        {
-            get
-            {
-                if (_instance == null)
-                {
-                    lock (Locker)
-                    {
-                        if (_instance == null || !_instance.IsConnected)
-                        {
-                            _instance = GetManager();
-                        }
-                    }
-                }
-                return _instance;
-            }
-        }
-
-        /// <summary>
-        /// 缓存获取
-        /// </summary>
-        /// <param name="connectionString">连接字符串</param>
-        /// <returns>连接对象</returns>
-        public static ConnectionMultiplexer GetConnectionMultiplexer(string connectionString)
-        {
-            if (!ConnectionCache.ContainsKey(connectionString))
-            {
-                ConnectionCache[connectionString] = GetManager(connectionString);
-            }
-            return ConnectionCache[connectionString];
-        }
-
-        private static ConnectionMultiplexer GetManager(string connectionString = null)
-        {
-            connectionString = connectionString ?? RedisConnectionString;
-            var connect = ConnectionMultiplexer.Connect(connectionString);
-
-            //注册如下事件
-            connect.ConnectionFailed += MuxerConnectionFailed;
-            connect.ConnectionRestored += MuxerConnectionRestored;
-            connect.ErrorMessage += MuxerErrorMessage;
-            connect.ConfigurationChanged += MuxerConfigurationChanged;
-            connect.HashSlotMoved += MuxerHashSlotMoved;
-            connect.InternalError += MuxerInternalError;
-
-            return connect;
-        }
-
-        #region 事件
-
-        /// <summary>
-        /// 配置更改时
-        /// </summary>
-        /// <param name="sender">触发者</param>
-        /// <param name="e">事件参数</param>
-        private static void MuxerConfigurationChanged(object sender, EndPointEventArgs e)
-        {
-            Console.WriteLine("Configuration changed: " + e.EndPoint);
-        }
-
-        /// <summary>
-        /// 发生错误时
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e)
-        {
-            Console.WriteLine("ErrorMessage: " + e.Message);
-        }
-
-        /// <summary>
-        /// 重新建立连接之前的错误
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private static void MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e)
-        {
-            Console.WriteLine("ConnectionRestored: " + e.EndPoint);
-        }
-
-        /// <summary>
-        /// 连接失败 , 如果重新连接成功你将不会收到这个通知
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)
-        {
-            Console.WriteLine("重新连接:Endpoint failed: " + e.EndPoint + ", " + e.FailureType + (e.Exception == null ? "" : (", " + e.Exception.Message)));
-        }
-
-        /// <summary>
-        /// 更改集群
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private static void MuxerHashSlotMoved(object sender, HashSlotMovedEventArgs e)
-        {
-            Console.WriteLine("HashSlotMoved:NewEndPoint" + e.NewEndPoint + ", OldEndPoint" + e.OldEndPoint);
-        }
-
-        /// <summary>
-        /// redis类库错误
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private static void MuxerInternalError(object sender, InternalErrorEventArgs e)
-        {
-            Console.WriteLine("InternalError:Message" + e.Exception.Message);
-        }
-
-        #endregion 事件
-    }
-}

+ 144 - 51
Masuit.Tools/NoSQL/RedisHelper.cs

@@ -14,11 +14,42 @@ namespace Masuit.Tools.NoSQL
     {
         private int DbNum { get; }
         private readonly ConnectionMultiplexer _conn;
+
         /// <summary>
         /// 自定义键
         /// </summary>
         public string CustomKey;
 
+        /// <summary>
+        /// 连接失败 , 如果重新连接成功你将不会收到这个通知
+        /// </summary>
+        public event EventHandler<ConnectionFailedEventArgs> ConnectionFailed;
+
+        /// <summary>
+        /// 重新建立连接之前的错误
+        /// </summary>
+        public event EventHandler<ConnectionFailedEventArgs> ConnectionRestored;
+
+        /// <summary>
+        /// 发生错误时
+        /// </summary>
+        public event EventHandler<RedisErrorEventArgs> ErrorMessage;
+
+        /// <summary>
+        /// 配置更改时
+        /// </summary>
+        public event EventHandler<EndPointEventArgs> ConfigurationChanged;
+
+        /// <summary>
+        /// 更改集群时
+        /// </summary>
+        public event EventHandler<HashSlotMovedEventArgs> HashSlotMoved;
+
+        /// <summary>
+        /// redis类库错误时
+        /// </summary>
+        public event EventHandler<InternalErrorEventArgs> InternalError;
+
         #region 构造函数
 
         /// <summary>
@@ -40,7 +71,13 @@ namespace Masuit.Tools.NoSQL
         public RedisHelper(int dbNum = 0, string readWriteHosts = "127.0.0.1:6379,allowadmin=true")
         {
             DbNum = dbNum;
-            _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? RedisConnectionHelp.Instance : RedisConnectionHelp.GetConnectionMultiplexer(readWriteHosts);
+            _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? RedisConnectionManager.Instance : RedisConnectionManager.GetConnectionMultiplexer(readWriteHosts);
+            _conn.ConfigurationChanged += ConfigurationChanged;
+            _conn.ConnectionFailed += ConnectionFailed;
+            _conn.ConnectionRestored += ConnectionRestored;
+            _conn.ErrorMessage += ErrorMessage;
+            _conn.HashSlotMoved += HashSlotMoved;
+            _conn.InternalError += InternalError;
         }
 
         /// <summary>
@@ -116,8 +153,12 @@ namespace Masuit.Tools.NoSQL
         /// <returns>值</returns>
         public string GetString(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(db => db.StringGet(key));
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                return Do(db => db.StringGet(key));
+            }
+            return string.Empty;
         }
 
         /// <summary>
@@ -139,8 +180,12 @@ namespace Masuit.Tools.NoSQL
         /// <returns>实例对象</returns>
         public T GetString<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(db => ConvertObj<T>(db.StringGet(key)));
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                return Do(db => ConvertObj<T>(db.StringGet(key)));
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -218,8 +263,12 @@ namespace Masuit.Tools.NoSQL
         /// <returns>值</returns>
         public async Task<string> GetStringAsync(string key)
         {
-            key = AddSysCustomKey(key);
-            return await Do(db => db.StringGetAsync(key));
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                return await Do(db => db.StringGetAsync(key));
+            }
+            return string.Empty;
         }
 
         /// <summary>
@@ -241,9 +290,13 @@ namespace Masuit.Tools.NoSQL
         /// <returns>实例对象</returns>
         public async Task<T> GetStringAsync<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            string result = await Do(db => db.StringGetAsync(key));
-            return ConvertObj<T>(result);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                string result = await Do(db => db.StringGetAsync(key));
+                return ConvertObj<T>(result);
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -342,12 +395,16 @@ namespace Masuit.Tools.NoSQL
         /// <returns>对象实例</returns>
         public T GetHash<T>(string key, string dataKey)
         {
-            key = AddSysCustomKey(key);
-            return Do(db =>
+            if (KeyExists(key))
             {
-                string value = db.HashGet(key, dataKey);
-                return ConvertObj<T>(value);
-            });
+                key = AddSysCustomKey(key);
+                return Do(db =>
+                {
+                    string value = db.HashGet(key, dataKey);
+                    return ConvertObj<T>(value);
+                });
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -459,9 +516,13 @@ namespace Masuit.Tools.NoSQL
         /// <returns>对象实例</returns>
         public async Task<T> GetHashAsync<T>(string key, string dataKey)
         {
-            key = AddSysCustomKey(key);
-            string value = await Do(db => db.HashGetAsync(key, dataKey));
-            return ConvertObj<T>(value);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                string value = await Do(db => db.HashGetAsync(key, dataKey));
+                return ConvertObj<T>(value);
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -531,12 +592,16 @@ namespace Masuit.Tools.NoSQL
         /// <returns>数据集</returns>
         public List<T> ListRange<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(redis =>
+            if (KeyExists(key))
             {
-                var values = redis.ListRange(key);
-                return ConvetList<T>(values);
-            });
+                key = AddSysCustomKey(key);
+                return Do(redis =>
+                {
+                    var values = redis.ListRange(key);
+                    return ConvetList<T>(values);
+                });
+            }
+            return new List<T>();
         }
 
         /// <summary>
@@ -559,12 +624,16 @@ namespace Masuit.Tools.NoSQL
         /// <returns>值</returns>
         public T ListRightPop<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(db =>
-             {
-                 var value = db.ListRightPop(key);
-                 return ConvertObj<T>(value);
-             });
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                return Do(db =>
+                {
+                    var value = db.ListRightPop(key);
+                    return ConvertObj<T>(value);
+                });
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -587,12 +656,16 @@ namespace Masuit.Tools.NoSQL
         /// <returns>对象实例</returns>
         public T ListLeftPop<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(db =>
+            if (KeyExists(key))
             {
-                var value = db.ListLeftPop(key);
-                return ConvertObj<T>(value);
-            });
+                key = AddSysCustomKey(key);
+                return Do(db =>
+                {
+                    var value = db.ListLeftPop(key);
+                    return ConvertObj<T>(value);
+                });
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -629,9 +702,13 @@ namespace Masuit.Tools.NoSQL
         /// <returns>数据集合</returns>
         public async Task<List<T>> ListRangeAsync<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            var values = await Do(redis => redis.ListRangeAsync(key));
-            return ConvetList<T>(values);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                var values = await Do(redis => redis.ListRangeAsync(key));
+                return ConvetList<T>(values);
+            }
+            return new List<T>();
         }
 
         /// <summary>
@@ -654,9 +731,13 @@ namespace Masuit.Tools.NoSQL
         /// <returns>对象实例</returns>
         public async Task<T> ListRightPopAsync<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            var value = await Do(db => db.ListRightPopAsync(key));
-            return ConvertObj<T>(value);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                var value = await Do(db => db.ListRightPopAsync(key));
+                return ConvertObj<T>(value);
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -679,9 +760,13 @@ namespace Masuit.Tools.NoSQL
         /// <returns>实例对象</returns>
         public async Task<T> ListLeftPopAsync<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            var value = await Do(db => db.ListLeftPopAsync(key));
-            return ConvertObj<T>(value);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                var value = await Do(db => db.ListLeftPopAsync(key));
+                return ConvertObj<T>(value);
+            }
+            return default(T);
         }
 
         /// <summary>
@@ -733,12 +818,16 @@ namespace Masuit.Tools.NoSQL
         /// <returns>数据集合</returns>
         public List<T> SetRangeSortedByRank<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            return Do(redis =>
+            if (KeyExists(key))
             {
-                var values = redis.SortedSetRangeByRank(key);
-                return ConvetList<T>(values);
-            });
+                key = AddSysCustomKey(key);
+                return Do(redis =>
+                {
+                    var values = redis.SortedSetRangeByRank(key);
+                    return ConvetList<T>(values);
+                });
+            }
+            return new List<T>();
         }
 
         /// <summary>
@@ -786,9 +875,13 @@ namespace Masuit.Tools.NoSQL
         /// <returns>数据集合</returns>
         public async Task<List<T>> SortedSetRangeByRankAsync<T>(string key)
         {
-            key = AddSysCustomKey(key);
-            var values = await Do(redis => redis.SortedSetRangeByRankAsync(key));
-            return ConvetList<T>(values);
+            if (KeyExists(key))
+            {
+                key = AddSysCustomKey(key);
+                var values = await Do(redis => redis.SortedSetRangeByRankAsync(key));
+                return ConvetList<T>(values);
+            }
+            return new List<T>();
         }
 
         /// <summary>