diff --git a/build/version.props b/build/version.props
index 18841930..1b54eb7f 100644
--- a/build/version.props
+++ b/build/version.props
@@ -1,29 +1,29 @@
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
- 1.9.2
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
+ 1.9.3
diff --git a/src/EasyCaching.CSRedis/DefaultCSRedisCachingProvider.Async.cs b/src/EasyCaching.CSRedis/DefaultCSRedisCachingProvider.Async.cs
index b3c2ad34..0f1e2389 100644
--- a/src/EasyCaching.CSRedis/DefaultCSRedisCachingProvider.Async.cs
+++ b/src/EasyCaching.CSRedis/DefaultCSRedisCachingProvider.Async.cs
@@ -5,6 +5,7 @@
using System.Threading;
using System.Threading.Tasks;
using EasyCaching.Core;
+ using EasyCaching.Core.Internal;
using global::CSRedis;
using Microsoft.Extensions.Logging;
@@ -346,7 +347,7 @@ public override async Task BaseSetAllAsync(IDictionary value, Time
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
@@ -375,7 +376,7 @@ public override async Task BaseSetAsync(string cacheKey, T cacheValue, TimeSp
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
@@ -405,7 +406,7 @@ public override async Task BaseTrySetAsync(string cacheKey, T cacheValu
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
diff --git a/src/EasyCaching.CSRedis/DefaultCSRedisCachingProvider.cs b/src/EasyCaching.CSRedis/DefaultCSRedisCachingProvider.cs
index de162c3f..8f34d3d4 100644
--- a/src/EasyCaching.CSRedis/DefaultCSRedisCachingProvider.cs
+++ b/src/EasyCaching.CSRedis/DefaultCSRedisCachingProvider.cs
@@ -2,6 +2,7 @@
{
using EasyCaching.Core;
using EasyCaching.Core.DistributedLock;
+ using EasyCaching.Core.Internal;
using EasyCaching.Core.Serialization;
using EasyCaching.CSRedis.DistributedLock;
using global::CSRedis;
@@ -458,7 +459,7 @@ public override void BaseSet(string cacheKey, T cacheValue, TimeSpan expirati
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
@@ -480,7 +481,7 @@ public override void BaseSetAll(IDictionary values, TimeSpan expir
//whether to use pipe based on redis mode
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
@@ -506,7 +507,7 @@ public override bool BaseTrySet(string cacheKey, T cacheValue, TimeSpan expir
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
diff --git a/src/EasyCaching.Core/Internal/RandomHelper.cs b/src/EasyCaching.Core/Internal/RandomHelper.cs
new file mode 100644
index 00000000..1976fd73
--- /dev/null
+++ b/src/EasyCaching.Core/Internal/RandomHelper.cs
@@ -0,0 +1,20 @@
+namespace EasyCaching.Core.Internal
+{
+ using System;
+
+ public static class RandomHelper
+ {
+#if NETSTANDARD2_0
+ private static readonly Random _random = new Random();
+#endif
+
+ public static int GetNext(int min, int max)
+ {
+#if NET6_0_OR_GREATER
+ return Random.Shared.Next(min, max);
+#else
+ return _random.Next(min, max);
+#endif
+ }
+ }
+}
diff --git a/src/EasyCaching.InMemory/DefaultInMemoryCachingProvider.Async.cs b/src/EasyCaching.InMemory/DefaultInMemoryCachingProvider.Async.cs
index 96b7050e..5a0b8c9a 100644
--- a/src/EasyCaching.InMemory/DefaultInMemoryCachingProvider.Async.cs
+++ b/src/EasyCaching.InMemory/DefaultInMemoryCachingProvider.Async.cs
@@ -5,6 +5,7 @@
using System.Threading;
using System.Threading.Tasks;
using EasyCaching.Core;
+ using EasyCaching.Core.Internal;
using Microsoft.Extensions.Logging;
///
@@ -184,7 +185,7 @@ public override Task BaseSetAsync(string cacheKey, T cacheValue, TimeSpan exp
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
diff --git a/src/EasyCaching.InMemory/DefaultInMemoryCachingProvider.cs b/src/EasyCaching.InMemory/DefaultInMemoryCachingProvider.cs
index 5eb78bc6..4a18578b 100644
--- a/src/EasyCaching.InMemory/DefaultInMemoryCachingProvider.cs
+++ b/src/EasyCaching.InMemory/DefaultInMemoryCachingProvider.cs
@@ -2,10 +2,12 @@
{
using EasyCaching.Core;
using EasyCaching.Core.DistributedLock;
+ using EasyCaching.Core.Internal;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
+ using System.Security.Cryptography;
///
/// MemoryCaching provider.
@@ -224,7 +226,7 @@ public override void BaseSet(string cacheKey, T cacheValue, TimeSpan expirati
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
diff --git a/src/EasyCaching.LiteDB/DefaultLiteDBCachingProvider.cs b/src/EasyCaching.LiteDB/DefaultLiteDBCachingProvider.cs
index 19d277d4..3dfb4b26 100644
--- a/src/EasyCaching.LiteDB/DefaultLiteDBCachingProvider.cs
+++ b/src/EasyCaching.LiteDB/DefaultLiteDBCachingProvider.cs
@@ -2,6 +2,7 @@
namespace EasyCaching.LiteDB
{
using EasyCaching.Core;
+ using EasyCaching.Core.Internal;
using global::LiteDB;
using Microsoft.Extensions.Logging;
using System;
@@ -216,7 +217,7 @@ public override void BaseSet(string cacheKey, T cacheValue, TimeSpan expirati
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration.Add(new TimeSpan(0, 0, addSec));
}
_cache.Upsert(new CacheItem
@@ -409,7 +410,7 @@ public override bool BaseTrySet(string cacheKey, T cacheValue, TimeSpan expir
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration.Add(new TimeSpan(0, 0, addSec));
}
diff --git a/src/EasyCaching.Memcached/DefaultMemcachedCachingProvider.Async.cs b/src/EasyCaching.Memcached/DefaultMemcachedCachingProvider.Async.cs
index 1d96f1d5..927b6497 100644
--- a/src/EasyCaching.Memcached/DefaultMemcachedCachingProvider.Async.cs
+++ b/src/EasyCaching.Memcached/DefaultMemcachedCachingProvider.Async.cs
@@ -6,6 +6,7 @@
using System.Threading;
using System.Threading.Tasks;
using EasyCaching.Core;
+ using EasyCaching.Core.Internal;
using Microsoft.Extensions.Logging;
///
@@ -160,7 +161,7 @@ public override async Task BaseSetAsync(string cacheKey, T cacheValue, TimeSp
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
@@ -327,7 +328,7 @@ public override Task BaseTrySetAsync(string cacheKey, T cacheValue, Tim
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
diff --git a/src/EasyCaching.Memcached/DefaultMemcachedCachingProvider.cs b/src/EasyCaching.Memcached/DefaultMemcachedCachingProvider.cs
index f0e15a58..ac7429c1 100644
--- a/src/EasyCaching.Memcached/DefaultMemcachedCachingProvider.cs
+++ b/src/EasyCaching.Memcached/DefaultMemcachedCachingProvider.cs
@@ -2,6 +2,7 @@
{
using EasyCaching.Core;
using EasyCaching.Core.DistributedLock;
+ using EasyCaching.Core.Internal;
using EasyCaching.Memcached.DistributedLock;
using Microsoft.Extensions.Logging;
using System;
@@ -205,7 +206,7 @@ public override void BaseSet(string cacheKey, T cacheValue, TimeSpan expirati
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
@@ -410,7 +411,7 @@ public override bool BaseTrySet(string cacheKey, T cacheValue, TimeSpan expir
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
diff --git a/src/EasyCaching.Redis/DefaultRedisCachingProvider.Async.cs b/src/EasyCaching.Redis/DefaultRedisCachingProvider.Async.cs
index 3604b5df..a6d24645 100644
--- a/src/EasyCaching.Redis/DefaultRedisCachingProvider.Async.cs
+++ b/src/EasyCaching.Redis/DefaultRedisCachingProvider.Async.cs
@@ -6,6 +6,7 @@
using System.Threading;
using System.Threading.Tasks;
using EasyCaching.Core;
+ using EasyCaching.Core.Internal;
using Microsoft.Extensions.Logging;
using StackExchange.Redis;
@@ -187,7 +188,7 @@ public override async Task BaseSetAsync(string cacheKey, T cacheValue, TimeSp
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
@@ -398,7 +399,7 @@ public override Task BaseTrySetAsync(string cacheKey, T cacheValue, Tim
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
diff --git a/src/EasyCaching.Redis/DefaultRedisCachingProvider.cs b/src/EasyCaching.Redis/DefaultRedisCachingProvider.cs
index fc81d510..adb74e79 100644
--- a/src/EasyCaching.Redis/DefaultRedisCachingProvider.cs
+++ b/src/EasyCaching.Redis/DefaultRedisCachingProvider.cs
@@ -4,6 +4,7 @@ namespace EasyCaching.Redis
{
using EasyCaching.Core;
using EasyCaching.Core.DistributedLock;
+ using EasyCaching.Core.Internal;
using EasyCaching.Core.Serialization;
using Microsoft.Extensions.Logging;
using StackExchange.Redis;
@@ -247,7 +248,7 @@ public override void BaseSet(string cacheKey, T cacheValue, TimeSpan expirati
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
@@ -574,7 +575,7 @@ public override bool BaseTrySet(string cacheKey, T cacheValue, TimeSpan expir
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration = expiration.Add(TimeSpan.FromSeconds(addSec));
}
diff --git a/src/EasyCaching.SQLite/DefaultSQLiteCachingProvider.Async.cs b/src/EasyCaching.SQLite/DefaultSQLiteCachingProvider.Async.cs
index 5463aec2..dce5ce03 100644
--- a/src/EasyCaching.SQLite/DefaultSQLiteCachingProvider.Async.cs
+++ b/src/EasyCaching.SQLite/DefaultSQLiteCachingProvider.Async.cs
@@ -7,6 +7,7 @@
using System.Threading.Tasks;
using Dapper;
using EasyCaching.Core;
+ using EasyCaching.Core.Internal;
using Microsoft.Extensions.Logging;
///
@@ -212,7 +213,7 @@ public override async Task BaseSetAsync(string cacheKey, T cacheValue, TimeSp
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration.Add(new TimeSpan(0, 0, addSec));
}
@@ -383,7 +384,7 @@ public override async Task BaseTrySetAsync(string cacheKey, T cacheValu
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration.Add(new TimeSpan(0, 0, addSec));
}
diff --git a/src/EasyCaching.SQLite/DefaultSQLiteCachingProvider.cs b/src/EasyCaching.SQLite/DefaultSQLiteCachingProvider.cs
index 3a47ca7b..9a27df2c 100644
--- a/src/EasyCaching.SQLite/DefaultSQLiteCachingProvider.cs
+++ b/src/EasyCaching.SQLite/DefaultSQLiteCachingProvider.cs
@@ -5,6 +5,7 @@
using System.Linq;
using Dapper;
using EasyCaching.Core;
+ using EasyCaching.Core.Internal;
using Microsoft.Data.Sqlite;
using Microsoft.Extensions.Logging;
@@ -209,7 +210,7 @@ public override void BaseSet(string cacheKey, T cacheValue, TimeSpan expirati
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration.Add(new TimeSpan(0, 0, addSec));
}
@@ -394,7 +395,7 @@ public override bool BaseTrySet(string cacheKey, T cacheValue, TimeSpan expir
if (MaxRdSecond > 0)
{
- var addSec = new Random().Next(1, MaxRdSecond);
+ var addSec = RandomHelper.GetNext(1, MaxRdSecond);
expiration.Add(new TimeSpan(0, 0, addSec));
}
diff --git a/test/EasyCaching.PerformanceTests/MBenchmark.cs b/test/EasyCaching.PerformanceTests/MBenchmark.cs
new file mode 100644
index 00000000..200d57e9
--- /dev/null
+++ b/test/EasyCaching.PerformanceTests/MBenchmark.cs
@@ -0,0 +1,62 @@
+namespace EasyCaching.PerformanceTests
+{
+ using BenchmarkDotNet.Attributes;
+ using Microsoft.Extensions.Caching.Memory;
+ using Microsoft.Extensions.DependencyInjection;
+ using System;
+ using System.Diagnostics;
+
+ [MemoryDiagnoser]
+ [AllStatisticsColumn]
+ public class MBenchmark
+ {
+ private Microsoft.Extensions.Caching.Memory.IMemoryCache mc;
+ private EasyCaching.Core.IEasyCachingProvider ec;
+
+ [GlobalSetup]
+ public void Setup()
+ {
+ var sc = new Microsoft.Extensions.DependencyInjection.ServiceCollection();
+ sc.AddMemoryCache();
+ sc.AddEasyCaching(x => x.UseInMemory("b1"));
+
+ var sp = sc.BuildServiceProvider();
+ mc = sp.GetRequiredService();
+ ec = sp.GetRequiredService();
+ }
+
+ [Benchmark]
+ public void MC_SET()
+ {
+ for (int i = 0; i < 1000000; i++)
+ {
+ mc.Set($"ms-key-out-{i}", "ms-value", System.TimeSpan.FromSeconds(5));
+ }
+ }
+
+ [Benchmark]
+ public void EC_SET()
+ {
+ for (int i = 0; i < 1000000; i++)
+ {
+ ec.Set($"ec-key-out-{i}", "ec-value", System.TimeSpan.FromSeconds(5));
+ }
+ }
+
+ public void Test()
+ {
+ Setup();
+
+ Stopwatch sw = new Stopwatch();
+ sw.Start();
+ MC_SET();
+ sw.Stop();
+ Console.WriteLine($"MC_SET: {sw.ElapsedMilliseconds}");
+
+ sw.Restart();
+ EC_SET();
+ sw.Stop();
+ Console.WriteLine($"EC_SET: {sw.ElapsedMilliseconds}");
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/EasyCaching.PerformanceTests/MemoryCacheBenchmark.cs b/test/EasyCaching.PerformanceTests/MemoryCacheBenchmark.cs
index 325b5de1..aee31371 100644
--- a/test/EasyCaching.PerformanceTests/MemoryCacheBenchmark.cs
+++ b/test/EasyCaching.PerformanceTests/MemoryCacheBenchmark.cs
@@ -4,8 +4,8 @@ namespace EasyCaching.PerformanceTests
{
using BenchmarkDotNet.Attributes;
using EasyCaching.InMemory;
- using Microsoft.Extensions.Caching.Memory;
-
+ using Microsoft.Extensions.Caching.Memory;
+
[MemoryDiagnoser]
[AllStatisticsColumn]
public class SetBenchmark
diff --git a/test/EasyCaching.PerformanceTests/Program.cs b/test/EasyCaching.PerformanceTests/Program.cs
index 21ece500..7c0494a4 100644
--- a/test/EasyCaching.PerformanceTests/Program.cs
+++ b/test/EasyCaching.PerformanceTests/Program.cs
@@ -12,7 +12,10 @@ static void Main(string[] args)
//BenchmarkRunner.Run();
//BenchmarkRunner.Run();
//BenchmarkRunner.Run();
- BenchmarkRunner.Run();
+ //BenchmarkRunner.Run();
+ // BenchmarkRunner.Run();
+ //BenchmarkRunner.Run();
+ new MBenchmark().Test();
}
}
}
diff --git a/test/EasyCaching.PerformanceTests/RandomNextBenchmark.cs b/test/EasyCaching.PerformanceTests/RandomNextBenchmark.cs
new file mode 100644
index 00000000..6ed19f71
--- /dev/null
+++ b/test/EasyCaching.PerformanceTests/RandomNextBenchmark.cs
@@ -0,0 +1,23 @@
+namespace EasyCaching.PerformanceTests
+{
+ using BenchmarkDotNet.Attributes;
+
+ [MemoryDiagnoser]
+ [AllStatisticsColumn]
+ public class RandomNextBenchmark
+ {
+ private static System.Random _random = new System.Random();
+
+ [Benchmark]
+ public int RandomRecreate() => new System.Random().Next(1, 10000);
+
+ [Benchmark]
+ public int RandomReuse() => _random.Next(1, 10000);
+
+ [Benchmark]
+ public int RandomGenerator() => System.Security.Cryptography.RandomNumberGenerator.GetInt32(1, 10000);
+
+ [Benchmark]
+ public int RandomShared() => System.Random.Shared.Next(1, 10000);
+ }
+}
\ No newline at end of file