diff --git a/Src/Asp.NetCore2/SqlSeverTest/CacheTest/CacheTest.csproj b/Src/Asp.NetCore2/SqlSeverTest/CacheTest/CacheTest.csproj
new file mode 100644
index 000000000..28f66a612
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSeverTest/CacheTest/CacheTest.csproj
@@ -0,0 +1,17 @@
+
+
+
+ Exe
+ netcoreapp3.1
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Src/Asp.NetCore2/SqlSeverTest/CacheTest/MemoryCacheHelper.cs b/Src/Asp.NetCore2/SqlSeverTest/CacheTest/MemoryCacheHelper.cs
new file mode 100644
index 000000000..dd91a43bc
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSeverTest/CacheTest/MemoryCacheHelper.cs
@@ -0,0 +1,282 @@
+using Microsoft.Extensions.Caching.Memory;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using SqlSugar;
+using System.Reflection;
+using System.Collections;
+using System.Text.RegularExpressions;
+
+namespace CacheTest
+{
+ public class SugarCache : ICacheService
+ {
+ MemoryCacheHelper cache = new MemoryCacheHelper();
+ public void Add(string key, V value)
+ {
+ cache.Set(key, value);
+ }
+
+ public void Add(string key, V value, int cacheDurationInSeconds)
+ {
+ cache.Set(key, value,cacheDurationInSeconds);
+ }
+
+ public bool ContainsKey(string key)
+ {
+ return cache.Exists(key);
+ }
+
+ public V Get(string key)
+ {
+ return cache.Get(key);
+ }
+
+ public IEnumerable GetAllKey()
+ {
+ return cache.GetCacheKeys();
+ }
+
+ public V GetOrCreate(string cacheKey, Func create, int cacheDurationInSeconds = int.MaxValue)
+ {
+ if (cache.Exists(cacheKey))
+ {
+ return cache.Get(cacheKey);
+ }
+ else
+ {
+ var result = create();
+ cache.Set(cacheKey, result, cacheDurationInSeconds);
+ return result;
+ }
+ }
+
+ public void Remove(string key)
+ {
+ cache.Remove(key);
+ }
+ }
+ public class MemoryCacheHelper
+ {
+ private static readonly MemoryCache Cache = new MemoryCache(new MemoryCacheOptions());
+
+ ///
+ /// 验证缓存项是否存在
+ ///
+ /// 缓存Key
+ ///
+ public bool Exists(string key)
+ {
+ if (key == null)
+ throw new ArgumentNullException(nameof(key));
+ return Cache.TryGetValue(key, out _);
+ }
+
+ ///
+ /// 添加缓存
+ ///
+ /// 缓存Key
+ /// 缓存Value
+ /// 滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)
+ /// 绝对过期时长
+ ///
+ public bool Set(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
+ {
+ if (key == null)
+ throw new ArgumentNullException(nameof(key));
+ if (value == null)
+ throw new ArgumentNullException(nameof(value));
+
+ Cache.Set(key, value,
+ new MemoryCacheEntryOptions().SetSlidingExpiration(expiresSliding)
+ .SetAbsoluteExpiration(expiressAbsoulte));
+ return Exists(key);
+ }
+
+ ///
+ /// 添加缓存
+ ///
+ /// 缓存Key
+ /// 缓存Value
+ /// 缓存时长
+ /// 是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)
+ ///
+ public bool Set(string key, object value, TimeSpan expiresIn, bool isSliding = false)
+ {
+ if (key == null)
+ throw new ArgumentNullException(nameof(key));
+ if (value == null)
+ throw new ArgumentNullException(nameof(value));
+
+ Cache.Set(key, value,
+ isSliding
+ ? new MemoryCacheEntryOptions().SetSlidingExpiration(expiresIn)
+ : new MemoryCacheEntryOptions().SetAbsoluteExpiration(expiresIn));
+
+ return Exists(key);
+ }
+
+ ///
+ /// 添加缓存
+ ///
+ /// 缓存Key
+ /// 缓存Value
+ ///
+ public void Set(string key, object value)
+ {
+ Set(key, value, TimeSpan.FromDays(1));
+ }
+
+ ///
+ /// 添加缓存
+ ///
+ /// 缓存Key
+ /// 缓存Value
+ ///
+ ///
+ public void Set(string key, object value, TimeSpan ts)
+ {
+ Set(key, value, ts, false);
+ }
+
+ ///
+ /// 添加缓存
+ ///
+ /// 缓存Key
+ /// 缓存Value
+ ///
+ ///
+ public void Set(string key, object value, int seconds)
+ {
+ var ts = TimeSpan.FromSeconds(seconds);
+ Set(key, value, ts, false);
+ }
+ #region 删除缓存
+
+ ///
+ /// 删除缓存
+ ///
+ /// 缓存Key
+ ///
+ public void Remove(string key)
+ {
+ if (key == null)
+ throw new ArgumentNullException(nameof(key));
+ Cache.Remove(key);
+ }
+
+ ///
+ /// 批量删除缓存
+ ///
+ ///
+ public void RemoveAll(IEnumerable keys)
+ {
+ if (keys == null)
+ throw new ArgumentNullException(nameof(keys));
+
+ keys.ToList().ForEach(item => Cache.Remove(item));
+ }
+ #endregion
+
+ #region 获取缓存
+
+ ///
+ /// 获取缓存
+ ///
+ /// 缓存Key
+ ///
+ public T Get(string key)
+ {
+ if (key == null)
+ throw new ArgumentNullException(nameof(key));
+
+ return Cache.Get(key);
+ }
+
+ ///
+ /// 获取缓存
+ ///
+ /// 缓存Key
+ ///
+ public object Get(string key)
+ {
+ if (key == null)
+ throw new ArgumentNullException(nameof(key));
+
+ return Cache.Get(key);
+ }
+
+ ///
+ /// 获取缓存集合
+ ///
+ /// 缓存Key集合
+ ///
+ public IDictionary GetAll(IEnumerable keys)
+ {
+ if (keys == null)
+ throw new ArgumentNullException(nameof(keys));
+
+ var dict = new Dictionary();
+ keys.ToList().ForEach(item => dict.Add(item, Cache.Get(item)));
+ return dict;
+ }
+ #endregion
+
+ ///
+ /// 删除所有缓存
+ ///
+ public void RemoveCacheAll()
+ {
+ var l = GetCacheKeys();
+ foreach (var s in l)
+ {
+ Remove(s);
+ }
+ }
+
+ ///
+ /// 删除匹配到的缓存
+ ///
+ ///
+ ///
+ public void RemoveCacheRegex(string pattern)
+ {
+ IList l = SearchCacheRegex(pattern);
+ foreach (var s in l)
+ {
+ Remove(s);
+ }
+ }
+
+ ///
+ /// 搜索 匹配到的缓存
+ ///
+ ///
+ ///
+ public IList SearchCacheRegex(string pattern)
+ {
+ var cacheKeys = GetCacheKeys();
+ var l = cacheKeys.Where(k => Regex.IsMatch(k, pattern)).ToList();
+ return l.AsReadOnly();
+ }
+
+ ///
+ /// 获取所有缓存键
+ ///
+ ///
+ public List GetCacheKeys()
+ {
+ const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
+ var entries = Cache.GetType().GetField("_entries", flags).GetValue(Cache);
+ var cacheItems = entries as IDictionary;
+ var keys = new List();
+ if (cacheItems == null) return keys;
+ foreach (DictionaryEntry cacheItem in cacheItems)
+ {
+ keys.Add(cacheItem.Key.ToString());
+ }
+ return keys;
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSeverTest/CacheTest/Program.cs b/Src/Asp.NetCore2/SqlSeverTest/CacheTest/Program.cs
new file mode 100644
index 000000000..76b579f0a
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSeverTest/CacheTest/Program.cs
@@ -0,0 +1,23 @@
+using System;
+
+namespace CacheTest
+{
+ class Program
+ {
+ static void Main(string[] args)
+ {
+ SugarCache cache = new SugarCache();
+ cache.Add("a", "1");
+
+ var x = cache.Get("a");
+ cache.Add("a2", "11",5);
+ var x2 = cache.Get("a2");
+ var isa= cache.ContainsKey("a2");
+ var allKeys = cache.GetAllKey();
+ var testr=cache.GetOrCreate("a33",()=> { return "aaa"; },10);
+ cache.Remove("aaaaaaaa");
+ cache.Remove("a");
+ Console.WriteLine("Hello World!");
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest.sln b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest.sln
index 16aa388f6..092dc515a 100644
--- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest.sln
+++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest.sln
@@ -17,9 +17,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NugetTest", "NugetTest\Nuge
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PgSqlTest", "PgSqlTest\PgSqlTest.csproj", "{B9005A73-5307-48FB-90EA-CC18FE6926E2}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DmOrmTest", "DmOrmTest\DmOrmTest.csproj", "{FBA1A5CC-1C9D-476F-B19D-FD5E2201C30A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DmOrmTest", "DmOrmTest\DmOrmTest.csproj", "{FBA1A5CC-1C9D-476F-B19D-FD5E2201C30A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KdbndpTest", "KdbndpTest\KdbndpTest.csproj", "{21744B61-74AB-4706-9A52-C9D0C4AAD19E}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KdbndpTest", "KdbndpTest\KdbndpTest.csproj", "{21744B61-74AB-4706-9A52-C9D0C4AAD19E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CacheTest", "CacheTest\CacheTest.csproj", "{2EC6C9BD-6B8F-4EC3-B4ED-EAEFD8BB735C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -63,6 +65,10 @@ Global
{21744B61-74AB-4706-9A52-C9D0C4AAD19E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{21744B61-74AB-4706-9A52-C9D0C4AAD19E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{21744B61-74AB-4706-9A52-C9D0C4AAD19E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2EC6C9BD-6B8F-4EC3-B4ED-EAEFD8BB735C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2EC6C9BD-6B8F-4EC3-B4ED-EAEFD8BB735C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2EC6C9BD-6B8F-4EC3-B4ED-EAEFD8BB735C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2EC6C9BD-6B8F-4EC3-B4ED-EAEFD8BB735C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE