懒得勤快 7 년 전
부모
커밋
6e756b5ce2

+ 18 - 0
Masuit.Tools.NoSQL.MongoDBClient.Core/CallContext.cs

@@ -0,0 +1,18 @@
+using System.Collections.Concurrent;
+using System.Threading;
+
+namespace Masuit.Tools.NoSQL.MongoDBClient.Core
+{
+    /// <summary>
+    /// 取线程内唯一对象
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    static class CallContext<T>
+    {
+        static ConcurrentDictionary<string, AsyncLocal<T>> state = new ConcurrentDictionary<string, AsyncLocal<T>>();
+
+        public static void SetData(string name, T data) => state.GetOrAdd(name, _ => new AsyncLocal<T>()).Value = data;
+
+        public static T GetData(string name) => state.TryGetValue(name, out AsyncLocal<T> data) ? data.Value : default(T);
+    }
+}

+ 35 - 0
Masuit.Tools.NoSQL.MongoDBClient.Core/ConcurrentLimitedQueue.cs

@@ -0,0 +1,35 @@
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Masuit.Tools.NoSQL.MongoDBClient.Core
+{
+    /// <summary>
+    /// 定长队列
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    class ConcurrentLimitedQueue<T> : ConcurrentQueue<T>
+    {
+        public int Limit { get; set; }
+
+        public ConcurrentLimitedQueue(int limit)
+        {
+            Limit = limit;
+        }
+
+        public ConcurrentLimitedQueue(IEnumerable<T> list) : base(list)
+        {
+            Limit = list.Count();
+        }
+
+        public new void Enqueue(T item)
+        {
+            if (Count >= Limit)
+            {
+                TryDequeue(out var _);
+            }
+
+            base.Enqueue(item);
+        }
+    }
+}

+ 3 - 3
Masuit.Tools.NoSQL.MongoDBClient.Core/Masuit.Tools.NoSQL.MongoDBClient.Core.csproj

@@ -2,7 +2,7 @@
 
 
   <PropertyGroup>
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <TargetFramework>netstandard2.0</TargetFramework>
-    <Version>1.8.5</Version>
+    <Version>1.8.6</Version>
     <Authors>懒得勤快</Authors>
     <Authors>懒得勤快</Authors>
     <Company>masuit.com</Company>
     <Company>masuit.com</Company>
     <Description>包含MongoDB的所有的增删查改。
     <Description>包含MongoDB的所有的增删查改。
@@ -13,8 +13,8 @@
     <PackageTags>Masuit.Tools</PackageTags>
     <PackageTags>Masuit.Tools</PackageTags>
     <PackageReleaseNotes>如有问题请联系QQ:1170397736,或者到项目的github反馈问题。</PackageReleaseNotes>
     <PackageReleaseNotes>如有问题请联系QQ:1170397736,或者到项目的github反馈问题。</PackageReleaseNotes>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-    <AssemblyVersion>1.8.5.0</AssemblyVersion>
-    <FileVersion>1.8.5.0</FileVersion>
+    <AssemblyVersion>1.8.6.0</AssemblyVersion>
+    <FileVersion>1.8.6.0</FileVersion>
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>

+ 34 - 1
Masuit.Tools.NoSQL.MongoDBClient.Core/MongoDbClient.cs

@@ -4,6 +4,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Linq.Expressions;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using Masuit.Tools.NoSQL.MongoDBClient.Core;
 using MongoDB.Bson;
 using MongoDB.Bson;
 using MongoDB.Driver;
 using MongoDB.Driver;
 
 
@@ -14,13 +15,19 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         public MongoClient Client { get; set; }
         public MongoClient Client { get; set; }
         public IMongoDatabase Database { get; set; }
         public IMongoDatabase Database { get; set; }
         private static ConcurrentDictionary<string, MongoDbClient> InstancePool { get; set; } = new ConcurrentDictionary<string, MongoDbClient>();
         private static ConcurrentDictionary<string, MongoDbClient> InstancePool { get; set; } = new ConcurrentDictionary<string, MongoDbClient>();
-
+        private static ConcurrentDictionary<string, ConcurrentLimitedQueue<MongoDbClient>> InstanceQueue { get; set; } = new ConcurrentDictionary<string, ConcurrentLimitedQueue<MongoDbClient>>();
         private MongoDbClient(string url, string database)
         private MongoDbClient(string url, string database)
         {
         {
             Client = new MongoClient(url);
             Client = new MongoClient(url);
             Database = Client.GetDatabase(database);
             Database = Client.GetDatabase(database);
         }
         }
 
 
+        private MongoDbClient(MongoClientSettings settings, string database)
+        {
+            Client = new MongoClient(settings);
+            Database = Client.GetDatabase(database);
+        }
+
         /// <summary>
         /// <summary>
         /// 获取mongo单例
         /// 获取mongo单例
         /// </summary>
         /// </summary>
@@ -38,6 +45,32 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
             return instance;
             return instance;
         }
         }
 
 
+        /// <summary>
+        /// 获取mongo线程内唯一对象
+        /// </summary>
+        /// <param name="url">连接字符串</param>
+        /// <param name="database">数据库</param>
+        /// <returns></returns>
+        public static MongoDbClient ThreadLocalInstance(string url, string database)
+        {
+            var queue = InstanceQueue.GetOrAdd(url + database, new ConcurrentLimitedQueue<MongoDbClient>(32));
+            if (queue.IsEmpty)
+            {
+                Parallel.For(0, queue.Limit, i =>
+                {
+                    queue.Enqueue(new MongoDbClient(url, database));
+                });
+            }
+            MongoDbClient instance;
+            if (CallContext<MongoDbClient>.GetData(url + database) == null)
+            {
+                queue.TryDequeue(out instance);
+                CallContext<MongoDbClient>.SetData(url + database, instance);
+            }
+            instance = CallContext<MongoDbClient>.GetData(url + database);
+            return instance;
+        }
+
         /// <summary>
         /// <summary>
         /// 获取表
         /// 获取表
         /// </summary>
         /// </summary>

+ 20 - 0
Masuit.Tools.NoSQL.MongoDBClient/Masuit.Tools.NoSQL.MongoDBClient.csproj

@@ -31,9 +31,22 @@
     <DocumentationFile>bin\Release\Masuit.Tools.NoSQL.MongoDBClient.xml</DocumentationFile>
     <DocumentationFile>bin\Release\Masuit.Tools.NoSQL.MongoDBClient.xml</DocumentationFile>
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
+    <Reference Include="AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL">
+      <HintPath>..\packages\AngleSharp.0.9.9\lib\net45\AngleSharp.dll</HintPath>
+    </Reference>
     <Reference Include="DnsClient, Version=1.0.7.0, Culture=neutral, PublicKeyToken=4574bb5573c51424, processorArchitecture=MSIL">
     <Reference Include="DnsClient, Version=1.0.7.0, Culture=neutral, PublicKeyToken=4574bb5573c51424, processorArchitecture=MSIL">
       <HintPath>..\packages\DnsClient.1.0.7\lib\net45\DnsClient.dll</HintPath>
       <HintPath>..\packages\DnsClient.1.0.7\lib\net45\DnsClient.dll</HintPath>
     </Reference>
     </Reference>
+    <Reference Include="HtmlSanitizer, Version=3.0.0.0, Culture=neutral, PublicKeyToken=61c49a1a9e79cc28, processorArchitecture=MSIL">
+      <HintPath>..\packages\HtmlSanitizer.4.0.181\lib\net45\HtmlSanitizer.dll</HintPath>
+    </Reference>
+    <Reference Include="ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
+      <HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
+    </Reference>
+    <Reference Include="Masuit.Tools, Version=1.9.4.1, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Masuit.Tools.1.9.4.1\lib\net45\Masuit.Tools.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.CSharp" />
     <Reference Include="MongoDB.Bson, Version=2.5.0.0, Culture=neutral, processorArchitecture=MSIL">
     <Reference Include="MongoDB.Bson, Version=2.5.0.0, Culture=neutral, processorArchitecture=MSIL">
       <HintPath>..\packages\MongoDB.Bson.2.5.0\lib\net45\MongoDB.Bson.dll</HintPath>
       <HintPath>..\packages\MongoDB.Bson.2.5.0\lib\net45\MongoDB.Bson.dll</HintPath>
     </Reference>
     </Reference>
@@ -43,11 +56,18 @@
     <Reference Include="MongoDB.Driver.Core, Version=2.5.0.0, Culture=neutral, processorArchitecture=MSIL">
     <Reference Include="MongoDB.Driver.Core, Version=2.5.0.0, Culture=neutral, processorArchitecture=MSIL">
       <HintPath>..\packages\MongoDB.Driver.Core.2.5.0\lib\net45\MongoDB.Driver.Core.dll</HintPath>
       <HintPath>..\packages\MongoDB.Driver.Core.2.5.0\lib\net45\MongoDB.Driver.Core.dll</HintPath>
     </Reference>
     </Reference>
+    <Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="StackExchange.Redis, Version=1.2.4.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\StackExchange.Redis.1.2.4\lib\net45\StackExchange.Redis.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System" />
     <Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
     <Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard1.1\System.Buffers.dll</HintPath>
       <HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard1.1\System.Buffers.dll</HintPath>
     </Reference>
     </Reference>
     <Reference Include="System.Core" />
     <Reference Include="System.Core" />
+    <Reference Include="System.IO.Compression" />
     <Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
     <Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
       <HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
     </Reference>
     </Reference>

+ 35 - 0
Masuit.Tools.NoSQL.MongoDBClient/MongoDbClient.cs

@@ -3,7 +3,9 @@ using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Linq.Expressions;
+using System.Runtime.Remoting.Messaging;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using Masuit.Tools.Systems;
 using MongoDB.Bson;
 using MongoDB.Bson;
 using MongoDB.Driver;
 using MongoDB.Driver;
 
 
@@ -14,12 +16,19 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
         public MongoClient Client { get; set; }
         public MongoClient Client { get; set; }
         public IMongoDatabase Database { get; set; }
         public IMongoDatabase Database { get; set; }
         private static ConcurrentDictionary<string, MongoDbClient> InstancePool { get; set; } = new ConcurrentDictionary<string, MongoDbClient>();
         private static ConcurrentDictionary<string, MongoDbClient> InstancePool { get; set; } = new ConcurrentDictionary<string, MongoDbClient>();
+        private static ConcurrentDictionary<string, ConcurrentLimitedQueue<MongoDbClient>> InstanceQueue { get; set; } = new ConcurrentDictionary<string, ConcurrentLimitedQueue<MongoDbClient>>();
         private MongoDbClient(string url, string database)
         private MongoDbClient(string url, string database)
         {
         {
             Client = new MongoClient(url);
             Client = new MongoClient(url);
             Database = Client.GetDatabase(database);
             Database = Client.GetDatabase(database);
         }
         }
 
 
+        private MongoDbClient(MongoClientSettings settings, string database)
+        {
+            Client = new MongoClient(settings);
+            Database = Client.GetDatabase(database);
+        }
+
         /// <summary>
         /// <summary>
         /// 获取mongo单例
         /// 获取mongo单例
         /// </summary>
         /// </summary>
@@ -37,6 +46,32 @@ namespace Masuit.Tools.NoSQL.MongoDBClient
             return instance;
             return instance;
         }
         }
 
 
+        /// <summary>
+        /// 获取mongo线程内唯一对象
+        /// </summary>
+        /// <param name="url">连接字符串</param>
+        /// <param name="database">数据库</param>
+        /// <returns></returns>
+        public static MongoDbClient ThreadLocalInstance(string url, string database)
+        {
+            var queue = InstanceQueue.GetOrAdd(url + database, new ConcurrentLimitedQueue<MongoDbClient>(32));
+            if (queue.IsEmpty)
+            {
+                Parallel.For(0, queue.Limit, i =>
+                {
+                    queue.Enqueue(new MongoDbClient(url, database));
+                });
+            }
+            MongoDbClient instance;
+            if (CallContext.GetData(url + database) == null)
+            {
+                queue.TryDequeue(out instance);
+                CallContext.SetData(url + database, instance);
+            }
+            instance = (MongoDbClient)CallContext.GetData(url + database);
+            return instance;
+        }
+
         /// <summary>
         /// <summary>
         /// 获取表
         /// 获取表
         /// </summary>
         /// </summary>

+ 2 - 2
Masuit.Tools.NoSQL.MongoDBClient/Properties/AssemblyInfo.cs

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 //通过使用 "*",如下所示:
 //通过使用 "*",如下所示:
 // [assembly: AssemblyVersion("1.0.*")]
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.8.5.0")]
-[assembly: AssemblyFileVersion("1.8.5.0")]
+[assembly: AssemblyVersion("1.8.6.0")]
+[assembly: AssemblyFileVersion("1.8.6.0")]

+ 4 - 0
Masuit.Tools.NoSQL.MongoDBClient/app.config

@@ -10,6 +10,10 @@
         <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
         <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
         <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
         <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
       </dependentAssembly>
       </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
+      </dependentAssembly>
     </assemblyBinding>
     </assemblyBinding>
   </runtime>
   </runtime>
 </configuration>
 </configuration>

+ 6 - 0
Masuit.Tools.NoSQL.MongoDBClient/packages.config

@@ -1,9 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
 <packages>
+  <package id="AngleSharp" version="0.9.9" targetFramework="net45" />
   <package id="DnsClient" version="1.0.7" targetFramework="net45" />
   <package id="DnsClient" version="1.0.7" targetFramework="net45" />
+  <package id="HtmlSanitizer" version="4.0.181" targetFramework="net45" />
+  <package id="Masuit.Tools" version="1.9.4.1" targetFramework="net45" developmentDependency="true" />
   <package id="MongoDB.Bson" version="2.5.0" targetFramework="net45" />
   <package id="MongoDB.Bson" version="2.5.0" targetFramework="net45" />
   <package id="MongoDB.Driver" version="2.5.0" targetFramework="net45" />
   <package id="MongoDB.Driver" version="2.5.0" targetFramework="net45" />
   <package id="MongoDB.Driver.Core" version="2.5.0" targetFramework="net45" />
   <package id="MongoDB.Driver.Core" version="2.5.0" targetFramework="net45" />
+  <package id="Newtonsoft.Json" version="10.0.3" targetFramework="net45" />
+  <package id="SharpZipLib" version="0.86.0" targetFramework="net45" />
+  <package id="StackExchange.Redis" version="1.2.4" targetFramework="net45" />
   <package id="System.Buffers" version="4.4.0" targetFramework="net45" />
   <package id="System.Buffers" version="4.4.0" targetFramework="net45" />
   <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net45" />
   <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net45" />
 </packages>
 </packages>

+ 4 - 5
NetCoreTest/Program.cs

@@ -1,8 +1,8 @@
 using System;
 using System;
-using System.Diagnostics;
-using System.Linq;
-using System.Threading.Tasks;
-using Masuit.Tools.NoSQL;
+using System.Collections.Generic;
+using Masuit.Tools.NoSQL.MongoDBClient;
+using MongoDB.Bson;
+using MongoDB.Driver;
 
 
 namespace NetCoreTest
 namespace NetCoreTest
 {
 {
@@ -10,7 +10,6 @@ namespace NetCoreTest
     {
     {
         static void Main(string[] args)
         static void Main(string[] args)
         {
         {
-            
             Console.WriteLine("ok");
             Console.WriteLine("ok");
         }
         }
     }
     }

+ 10 - 15
Test/Program.cs

@@ -1,9 +1,9 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
+using System.Collections.Generic;
+using System.Linq;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
-using Masuit.Tools;
-using Masuit.Tools.NoSQL;
+using Masuit.Tools.NoSQL.MongoDBClient;
+using MongoDB.Bson;
+using MongoDB.Driver;
 
 
 namespace Test
 namespace Test
 {
 {
@@ -90,16 +90,11 @@ namespace Test
 
 
             //bool b = "[email protected]".MatchEmail();
             //bool b = "[email protected]".MatchEmail();
 
 
-            RedisHelper redisHelper = RedisHelper.GetInstance("127.0.0.1:6379,synctimeout=1000");
-            redisHelper.SetString("balance", 100);
-            Stopwatch sw = new Stopwatch();
-            sw.Start();
-            Parallel.Invoke(() => { Parallel.For(0, 100000, i => { redisHelper.StringIncrement("balance"); }); }, () => Parallel.For(0, 100000, i => { redisHelper.StringIncrement("balance", -1); }));
-            sw.Stop();
-            Console.WriteLine(sw.ElapsedMilliseconds);
-            GC.Collect();
-            GC.SuppressFinalize(redisHelper);
-            Console.ReadKey();
+            MongoDbClient mc = MongoDbClient.ThreadLocalInstance("mongodb://127.0.0.1:27000,127.0.0.1:27001,127.0.0.1:27002/?slaveOk=true;maxPoolSize=100000;minPoolSize=32", "repl");
+            Parallel.For(0, 100000, i => mc.InsertOne("repl",new { name = "aa", value = 100 }));
+            Parallel.For(0, 100000, i => mc.GetMany("repl",Builders<BsonDocument>.Filter.Eq(doc => doc["value"], 100)).ToList());
+
+            //Console.ReadKey();
         }
         }
     }
     }