Browse Source

Redis类初始化改进

懒得勤快 7 years ago
parent
commit
88bc1fd86d

+ 138 - 4
Masuit.Tools.Core/NoSQL/RedisHelper.cs

@@ -1,8 +1,8 @@
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
-using Masuit.Tools.Core.NoSQL;
 using Newtonsoft.Json;
 using StackExchange.Redis;
 
@@ -11,11 +11,20 @@ namespace Masuit.Tools.NoSQL
     /// <summary>
     /// Redis操作
     /// </summary>
-    public class RedisHelper
+    public class RedisHelper : IDisposable
     {
         private int DbNum { get; }
         private readonly ConnectionMultiplexer _conn;
 
+        /// <summary>
+        /// Redis服务器连接字符串,默认为:127.0.0.1:6379,allowadmin=true<br/>
+        /// </summary>
+        public static string RedisConnectionString
+        {
+            get => "127.0.0.1:6379,allowadmin=true";
+            set { }
+        }
+
         /// <summary>
         /// 自定义键
         /// </summary>
@@ -51,6 +60,10 @@ namespace Masuit.Tools.NoSQL
         /// </summary>
         public event EventHandler<InternalErrorEventArgs> InternalError;
 
+        /// <summary>
+        /// 静态连接池
+        /// </summary>
+        public static ConcurrentDictionary<string, ConnectionMultiplexer> ConnectionCache { get; set; } = new ConcurrentDictionary<string, ConnectionMultiplexer>();
         #region 构造函数
 
         /// <summary>
@@ -72,17 +85,47 @@ namespace Masuit.Tools.NoSQL
         public RedisHelper(string readWriteHosts, int dbNum = 0)
         {
             DbNum = dbNum;
-            _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? RedisConnectionManager.Instance : RedisConnectionManager.GetConnectionMultiplexer(readWriteHosts);
+            _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(RedisConnectionString)) : ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(readWriteHosts));
+            _conn.ConfigurationChanged += MuxerConfigurationChanged;
             _conn.ConfigurationChanged += ConfigurationChanged;
+            _conn.ConnectionFailed += MuxerConnectionFailed;
             _conn.ConnectionFailed += ConnectionFailed;
+            _conn.ConnectionRestored += MuxerConnectionRestored;
             _conn.ConnectionRestored += ConnectionRestored;
+            _conn.ErrorMessage += MuxerErrorMessage;
             _conn.ErrorMessage += ErrorMessage;
+            _conn.HashSlotMoved += MuxerHashSlotMoved;
             _conn.HashSlotMoved += HashSlotMoved;
+            _conn.InternalError += MuxerInternalError;
             _conn.InternalError += InternalError;
         }
 
         /// <summary>
-        /// 从对象池获取默认实例
+        /// 构造函数
+        /// </summary>
+        /// <param name="readWriteHosts">Redis服务器连接字符串,格式:127.0.0.1:6379,allowadmin=true</param>
+        /// <param name="dbNum">数据库的编号</param>
+        private RedisHelper(string readWriteHosts, int dbNum, int _)
+        {
+            DbNum = dbNum;
+            readWriteHosts = string.IsNullOrWhiteSpace(readWriteHosts) ? RedisConnectionString : readWriteHosts;
+            _conn = ConnectionCache.GetOrAdd(readWriteHosts, ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(readWriteHosts)));
+            _conn.ConfigurationChanged += MuxerConfigurationChanged;
+            _conn.ConfigurationChanged += ConfigurationChanged;
+            _conn.ConnectionFailed += MuxerConnectionFailed;
+            _conn.ConnectionFailed += ConnectionFailed;
+            _conn.ConnectionRestored += MuxerConnectionRestored;
+            _conn.ConnectionRestored += ConnectionRestored;
+            _conn.ErrorMessage += MuxerErrorMessage;
+            _conn.ErrorMessage += ErrorMessage;
+            _conn.HashSlotMoved += MuxerHashSlotMoved;
+            _conn.HashSlotMoved += HashSlotMoved;
+            _conn.InternalError += MuxerInternalError;
+            _conn.InternalError += InternalError;
+        }
+
+        /// <summary>
+        /// 获取新实例
         /// </summary>
         /// <param name="db">数据库的编号</param>
         /// <returns></returns>
@@ -91,6 +134,16 @@ namespace Masuit.Tools.NoSQL
             return new RedisHelper(db);
         }
 
+        /// <summary>
+        /// 获取单例
+        /// </summary>
+        /// <param name="db">数据库的编号</param>
+        /// <returns></returns>
+        public static RedisHelper GetSingleInstance(int db = 0)
+        {
+            return new RedisHelper(null, db, 0);
+        }
+
         /// <summary>
         /// 从对象池获取默认实例
         /// </summary>
@@ -101,6 +154,18 @@ namespace Masuit.Tools.NoSQL
         {
             return new RedisHelper(conn, db);
         }
+
+        /// <summary>
+        /// 获取单例
+        /// </summary>
+        /// <param name="conn">Redis服务器连接字符串,格式:127.0.0.1:6379,allowadmin=true</param>
+        /// <param name="db">数据库的编号</param>
+        /// <returns></returns>
+        public static RedisHelper GetSingleInstance(string conn, int db = 0)
+        {
+            return new RedisHelper(conn, db, 0);
+        }
+
         #endregion 构造函数
 
         #region String
@@ -1101,5 +1166,74 @@ namespace Masuit.Tools.NoSQL
 
         #endregion 辅助方法
 
+        #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 事件
+
+        /// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
+        public void Dispose()
+        {
+            _conn.Dispose();
+        }
     }
 }

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

@@ -103,7 +103,6 @@
     <Compile Include="Net\MultiThreadDownloader.cs" />
     <Compile Include="Net\PartialDownloader.cs" />
     <Compile Include="Net\SocketClient.cs" />
-    <Compile Include="NoSQL\RedisConnectionManager.cs" />
     <Compile Include="NoSQL\RedisHelper.cs" />
     <Compile Include="Reflection\ReflectHelper.cs" />
     <Compile Include="Reflection\ReflectionUtil.cs" />

+ 2 - 75
Masuit.Tools/NoSQL/RedisConnectionManager.cs

@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Concurrent;
+using System.Collections.Concurrent;
 using System.Configuration;
 using StackExchange.Redis;
 
@@ -8,7 +7,7 @@ namespace Masuit.Tools.NoSQL
     /// <summary>
     /// ConnectionMultiplexer对象管理帮助类
     /// </summary>
-    public static class RedisConnectionManager
+    public static class RedisConnectionManager2
     {
         /// <summary>
         /// Redis服务器连接字符串,在config配置文件中的ConnectionStrings节下配置,name固定为RedisHosts,值的格式:127.0.0.1:6379,allowadmin=true,如:<br/>
@@ -47,80 +46,8 @@ namespace Masuit.Tools.NoSQL
         {
             connectionString = connectionString ?? RedisConnectionString;
             var connect = ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(connectionString, true));
-
-            //注册如下事件
-            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 事件
     }
 }

+ 130 - 3
Masuit.Tools/NoSQL/RedisHelper.cs

@@ -1,5 +1,7 @@
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
+using System.Configuration;
 using System.Linq;
 using System.Threading.Tasks;
 using Newtonsoft.Json;
@@ -10,7 +12,7 @@ namespace Masuit.Tools.NoSQL
     /// <summary>
     /// Redis操作
     /// </summary>
-    public class RedisHelper
+    public class RedisHelper : IDisposable
     {
         private int DbNum { get; }
         private readonly ConnectionMultiplexer _conn;
@@ -50,6 +52,10 @@ namespace Masuit.Tools.NoSQL
         /// </summary>
         public event EventHandler<InternalErrorEventArgs> InternalError;
 
+        /// <summary>
+        /// 静态连接池
+        /// </summary>
+        public static ConcurrentDictionary<string, ConnectionMultiplexer> ConnectionCache { get; set; } = new ConcurrentDictionary<string, ConnectionMultiplexer>();
         #region 构造函数
 
         /// <summary>
@@ -71,17 +77,47 @@ namespace Masuit.Tools.NoSQL
         public RedisHelper(string readWriteHosts, int dbNum = 0)
         {
             DbNum = dbNum;
-            _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? RedisConnectionManager.Instance : RedisConnectionManager.GetConnectionMultiplexer(readWriteHosts);
+            _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(ConfigurationManager.ConnectionStrings["RedisHosts"]?.ConnectionString ?? "127.0.0.1:6379,allowadmin=true")) : ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(readWriteHosts));
+            _conn.ConfigurationChanged += MuxerConfigurationChanged;
             _conn.ConfigurationChanged += ConfigurationChanged;
+            _conn.ConnectionFailed += MuxerConnectionFailed;
             _conn.ConnectionFailed += ConnectionFailed;
+            _conn.ConnectionRestored += MuxerConnectionRestored;
             _conn.ConnectionRestored += ConnectionRestored;
+            _conn.ErrorMessage += MuxerErrorMessage;
             _conn.ErrorMessage += ErrorMessage;
+            _conn.HashSlotMoved += MuxerHashSlotMoved;
             _conn.HashSlotMoved += HashSlotMoved;
+            _conn.InternalError += MuxerInternalError;
             _conn.InternalError += InternalError;
         }
 
         /// <summary>
-        /// 从对象池获取默认实例
+        /// 构造函数
+        /// </summary>
+        /// <param name="readWriteHosts">Redis服务器连接字符串,格式:127.0.0.1:6379,allowadmin=true</param>
+        /// <param name="dbNum">数据库的编号</param>
+        private RedisHelper(string readWriteHosts, int dbNum, int _)
+        {
+            DbNum = dbNum;
+            readWriteHosts = string.IsNullOrWhiteSpace(readWriteHosts) ? ConfigurationManager.ConnectionStrings["RedisHosts"]?.ConnectionString ?? "127.0.0.1:6379,allowadmin=true" : readWriteHosts;
+            _conn = ConnectionCache.GetOrAdd(readWriteHosts, ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(readWriteHosts)));
+            _conn.ConfigurationChanged += MuxerConfigurationChanged;
+            _conn.ConfigurationChanged += ConfigurationChanged;
+            _conn.ConnectionFailed += MuxerConnectionFailed;
+            _conn.ConnectionFailed += ConnectionFailed;
+            _conn.ConnectionRestored += MuxerConnectionRestored;
+            _conn.ConnectionRestored += ConnectionRestored;
+            _conn.ErrorMessage += MuxerErrorMessage;
+            _conn.ErrorMessage += ErrorMessage;
+            _conn.HashSlotMoved += MuxerHashSlotMoved;
+            _conn.HashSlotMoved += HashSlotMoved;
+            _conn.InternalError += MuxerInternalError;
+            _conn.InternalError += InternalError;
+        }
+
+        /// <summary>
+        /// 获取新实例
         /// </summary>
         /// <param name="db">数据库的编号</param>
         /// <returns></returns>
@@ -90,6 +126,16 @@ namespace Masuit.Tools.NoSQL
             return new RedisHelper(db);
         }
 
+        /// <summary>
+        /// 获取单例
+        /// </summary>
+        /// <param name="db">数据库的编号</param>
+        /// <returns></returns>
+        public static RedisHelper GetSingleInstance(int db = 0)
+        {
+            return new RedisHelper(null, db, 0);
+        }
+
         /// <summary>
         /// 从对象池获取默认实例
         /// </summary>
@@ -100,6 +146,18 @@ namespace Masuit.Tools.NoSQL
         {
             return new RedisHelper(conn, db);
         }
+
+        /// <summary>
+        /// 获取单例
+        /// </summary>
+        /// <param name="conn">Redis服务器连接字符串,格式:127.0.0.1:6379,allowadmin=true</param>
+        /// <param name="db">数据库的编号</param>
+        /// <returns></returns>
+        public static RedisHelper GetSingleInstance(string conn, int db = 0)
+        {
+            return new RedisHelper(conn, db, 0);
+        }
+
         #endregion 构造函数
 
         #region String
@@ -1100,5 +1158,74 @@ namespace Masuit.Tools.NoSQL
 
         #endregion 辅助方法
 
+        #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 事件
+
+        /// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
+        public void Dispose()
+        {
+            _conn.Dispose();
+        }
     }
 }