优化模型处理默认的list改成array

This commit is contained in:
xuejiaming 2022-11-28 13:04:07 +08:00
parent bf676d6815
commit 1f810f9442
4 changed files with 93 additions and 48 deletions

View File

@ -0,0 +1,44 @@
using System.Collections.Concurrent;
using Microsoft.Extensions.Caching.Memory;
using ShardingCore.Core.ModelCacheLockerProviders;
using ShardingCore.Helpers;
namespace Sample.MySql;
public class DicModelCacheLockerProvider:IModelCacheLockerProvider
{
private readonly ConcurrentDictionary<string, object> _locks = new ConcurrentDictionary<string, object>();
public int GetCacheModelLockObjectSeconds()
{
return 20;
}
public CacheItemPriority GetCacheItemPriority()
{
return CacheItemPriority.High;
}
public int GetCacheEntrySize()
{
return 1;
}
public object GetCacheLockObject(object modelCacheKey)
{
var key = $"{modelCacheKey}";
Console.WriteLine("-----------------------------------------------DicModelCacheLockerProvider:"+key);
if (!_locks.TryGetValue(key, out var obj))
{
obj = new object();
if (_locks.TryAdd(key, obj))
{
return obj;
}
if (!_locks.TryGetValue(key, out obj))
{
throw new Exception("错了");
}
}
return obj;
}
}

View File

@ -1,6 +1,8 @@
using System.Diagnostics; using System.Diagnostics;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.Extensions.Caching.Memory;
using Sample.MySql.DbContexts; using Sample.MySql.DbContexts;
using Sample.MySql.Domain.Entities; using Sample.MySql.Domain.Entities;
using Sample.MySql.multi; using Sample.MySql.multi;
@ -8,6 +10,7 @@ using Sample.MySql.Shardings;
using ShardingCore; using ShardingCore;
using ShardingCore.Bootstrappers; using ShardingCore.Bootstrappers;
using ShardingCore.Core; using ShardingCore.Core;
using ShardingCore.Core.ModelCacheLockerProviders;
using ShardingCore.Core.RuntimeContexts; using ShardingCore.Core.RuntimeContexts;
using ShardingCore.EFCores; using ShardingCore.EFCores;
using ShardingCore.Extensions; using ShardingCore.Extensions;
@ -55,46 +58,7 @@ namespace Sample.MySql
{ {
// services.AddHostedService<AutoStart>(); // services.AddHostedService<AutoStart>();
services.AddControllers(); services.AddControllers();
// services.AddShardingDbContext<ShardingDefaultDbContext, DefaultDbContext>(o => o.UseMySql(hostBuilderContext.Configuration.GetSection("MySql")["ConnectionString"],new MySqlServerVersion("5.7.15")) services.AddSingleton<IMemoryCache>(sp => new MemoryCache(new MemoryCacheOptions { SizeLimit = 102400 }));
// ,op =>
// {
// op.EnsureCreatedWithOutShardingTable = true;
// op.CreateShardingTableOnStart = true;
// op.UseShardingOptionsBuilder((connection, builder) => builder.UseMySql(connection,new MySqlServerVersion("5.7.15")).UseLoggerFactory(efLogger),
// (conStr,builder)=> builder.UseMySql(conStr,new MySqlServerVersion("5.7.15")).UseLoggerFactory(efLogger));
// op.AddShardingTableRoute<SysUserModVirtualTableRoute>();
// op.AddShardingTableRoute<SysUserSalaryVirtualTableRoute>();
// });
// services.AddMultiShardingDbContext<OtherDbContext>()
// .UseRouteConfig(op =>
// {
// op.AddShardingTableRoute<MyUserRoute>();
// })
// .UseConfig((sp,o) =>
// {
// o.ThrowIfQueryRouteNotMatch = false;
// o.UseShardingQuery((conStr, builder) =>
// {
// builder.UseMySql(conStr, new MySqlServerVersion(new Version()))
// .UseLoggerFactory(efLogger)
// .EnableSensitiveDataLogging()
// .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
// });
// o.UseShardingTransaction((connection, builder) =>
// {
// builder
// .UseMySql(connection, new MySqlServerVersion(new Version()))
// .UseLoggerFactory(efLogger)
// .EnableSensitiveDataLogging()
// .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
// });
// o.UseShardingMigrationConfigure(b =>
// {
// b.ReplaceService<IMigrationsSqlGenerator, ShardingMySqlMigrationsSqlGenerator>();
// });
// o.AddDefaultDataSource("ds0",
// "server=127.0.0.1;port=3306;database=dbdbdx;userid=root;password=root;");
// }).ReplaceService<ITableEnsureManager, MySqlTableEnsureManager>().AddShardingCore();
services.AddShardingDbContext<DefaultShardingDbContext>() services.AddShardingDbContext<DefaultShardingDbContext>()
.UseRouteConfig(o => .UseRouteConfig(o =>
{ {
@ -104,6 +68,11 @@ namespace Sample.MySql
o.AddShardingDataSourceRoute<SysUserModVirtualDataSourceRoute>(); o.AddShardingDataSourceRoute<SysUserModVirtualDataSourceRoute>();
}).UseConfig((sp,o) => }).UseConfig((sp,o) =>
{ {
var memoryCache = sp.ApplicationServiceProvider.GetRequiredService<IMemoryCache>();
o.UseExecutorDbContextConfigure(b =>
{
b.UseMemoryCache(memoryCache);
});
o.CacheModelLockConcurrencyLevel = 1024; o.CacheModelLockConcurrencyLevel = 1024;
o.CacheEntrySize = 1; o.CacheEntrySize = 1;
o.CacheModelLockObjectSeconds = 10; o.CacheModelLockObjectSeconds = 10;
@ -139,7 +108,7 @@ namespace Sample.MySql
{ {
b.ReplaceService<IMigrationsSqlGenerator, ShardingMySqlMigrationsSqlGenerator>(); b.ReplaceService<IMigrationsSqlGenerator, ShardingMySqlMigrationsSqlGenerator>();
}); });
}) }).ReplaceService<IModelCacheLockerProvider,DicModelCacheLockerProvider>()
.AddShardingCore(); .AddShardingCore();
// services.AddDbContext<DefaultShardingDbContext>(ShardingCoreExtension // services.AddDbContext<DefaultShardingDbContext>(ShardingCoreExtension
// .UseMutliDefaultSharding<DefaultShardingDbContext>); // .UseMutliDefaultSharding<DefaultShardingDbContext>);

View File

@ -10,7 +10,7 @@ namespace ShardingCore.Core.ModelCacheLockerProviders
public class DefaultModelCacheLockerProvider : IModelCacheLockerProvider public class DefaultModelCacheLockerProvider : IModelCacheLockerProvider
{ {
private readonly ShardingConfigOptions _shardingConfigOptions; private readonly ShardingConfigOptions _shardingConfigOptions;
private readonly List<object> _locks; private readonly object[] _locks;
public DefaultModelCacheLockerProvider(ShardingConfigOptions shardingConfigOptions) public DefaultModelCacheLockerProvider(ShardingConfigOptions shardingConfigOptions)
{ {
@ -21,10 +21,10 @@ namespace ShardingCore.Core.ModelCacheLockerProviders
$"{shardingConfigOptions.CacheModelLockConcurrencyLevel} should > 0"); $"{shardingConfigOptions.CacheModelLockConcurrencyLevel} should > 0");
} }
_locks = new List<object>(shardingConfigOptions.CacheModelLockConcurrencyLevel); _locks = new object [shardingConfigOptions.CacheModelLockConcurrencyLevel];
for (int i = 0; i < shardingConfigOptions.CacheModelLockConcurrencyLevel; i++) for (int i = 0; i < shardingConfigOptions.CacheModelLockConcurrencyLevel; i++)
{ {
_locks.Add(new object()); _locks[i] = new object();
} }
} }
@ -54,14 +54,13 @@ namespace ShardingCore.Core.ModelCacheLockerProviders
$"modelCacheKey is null cant {nameof(GetCacheLockObject)}"); $"modelCacheKey is null cant {nameof(GetCacheLockObject)}");
} }
if (_locks.Count == 1) if (_locks.Length == 1)
{ {
return _locks[0]; return _locks[0];
} }
var hashCode = (modelCacheKey.ToString() ?? "").GetHashCode(); var hashCode = (modelCacheKey.ToString() ?? "").GetHashCode();
var lockIndex = hashCode % _locks.Count; var index = Math.Abs(hashCode % _locks.Length);
var index = lockIndex >= 0 ? lockIndex : Math.Abs(lockIndex);
return _locks[index]; return _locks[index];
} }
} }

View File

@ -1,11 +1,44 @@
using System.Diagnostics; using System.Diagnostics;
using ShardingCore.Core.Collections; using ShardingCore.Core.Collections;
using ShardingCore.Helpers;
using Xunit; using Xunit;
namespace ShardingCore.CommonTest namespace ShardingCore.CommonTest
{ {
public class CommonTest public class CommonTest
{ {
[Fact]
public void TestHashCode()
{
var list = new List<string>();
for (int i = 0; i < 100000; i++)
{
list.Add(Guid.NewGuid().ToString()+Guid.NewGuid().ToString()+Guid.NewGuid().ToString()+Guid.NewGuid().ToString());
}
Stopwatch sp =Stopwatch.StartNew();
for (int i = 0; i < 100000; i++)
{
ShardingCoreHelper.GetStringHashCode(list[i]);
}
sp.Stop();
var x = sp.ElapsedMilliseconds;
sp.Restart();
for (int i = 0; i < 100000; i++)
{
list[i].GetHashCode();
}
sp.Stop();
var y = sp.ElapsedMilliseconds;
sp.Restart();
for (int i = 0; i < 100000; i++)
{
ShardingCoreHelper.GetStringHashCode(list[i]);
}
sp.Stop();
var z = sp.ElapsedMilliseconds;
}
[Fact] [Fact]
public void TestList() public void TestList()
{ {