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