diff --git a/CoreCms.Net.Caching/CoreCms.Net.Caching.csproj b/CoreCms.Net.Caching/CoreCms.Net.Caching.csproj index 01971e0b..709d49c0 100644 --- a/CoreCms.Net.Caching/CoreCms.Net.Caching.csproj +++ b/CoreCms.Net.Caching/CoreCms.Net.Caching.csproj @@ -5,6 +5,7 @@ + diff --git a/CoreCms.Net.Caching/SqlSugar/SqlSugarCache.cs b/CoreCms.Net.Caching/SqlSugar/SqlSugarCache.cs new file mode 100644 index 00000000..b8771689 --- /dev/null +++ b/CoreCms.Net.Caching/SqlSugar/SqlSugarCache.cs @@ -0,0 +1,58 @@ +using CoreCms.Net.Utility; +using EasyCaching.Core; +using SqlSugar; +using System; +using System.Collections.Generic; + +namespace CoreCms.Net.Caching.SqlSugar +{ + /// + /// 仅供ORM缓存使用 + /// + public class SqlSugarCache : ICacheService + { + private static readonly IEasyCachingProvider cache = Storage.GetService(); + + public void Add(string key, V value) + { + cache.Set(key, value, TimeSpan.FromSeconds(int.MaxValue)); + } + + public void Add(string key, V value, int cacheDurationInSeconds) + { + cache.Set(key, value, TimeSpan.FromSeconds(cacheDurationInSeconds)); + } + + public bool ContainsKey(string key) + { + return cache.Exists(key); + } + + public V Get(string key) + { + return cache.Get(key).Value; + } + + public IEnumerable GetAllKey() + { + return cache.GetByPrefix("SqlSugarDataCache.").Keys; + } + + public void Remove(string key) + { + cache.Remove(key); + } + + public V GetOrCreate(string cacheKey, Func create, int cacheDurationInSeconds = 2147483647) + { + if (cache.Exists(cacheKey)) + { + return cache.Get(cacheKey).Value; + } + + V v = create(); + cache.Set(cacheKey, v, TimeSpan.FromSeconds(cacheDurationInSeconds)); + return v; + } + } +} \ No newline at end of file diff --git a/CoreCms.Net.Caching/SqlSugar/SqlSugarMemoryCache.cs b/CoreCms.Net.Caching/SqlSugar/SqlSugarMemoryCache.cs deleted file mode 100644 index 1c5e4b80..00000000 --- a/CoreCms.Net.Caching/SqlSugar/SqlSugarMemoryCache.cs +++ /dev/null @@ -1,282 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using Microsoft.Extensions.Caching.Memory; -using SqlSugar; - -namespace CoreCms.Net.Caching.SqlSugar -{ - public class SqlSugarMemoryCache : 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 Microsoft.Extensions.Caching.Memory.MemoryCache Cache = new Microsoft.Extensions.Caching.Memory.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); - } - - /// - /// 删除缓存 - /// - /// 缓存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)); - } - - - #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/CoreCms.Net.Caching/SqlSugar/SqlSugarRedisCache.cs b/CoreCms.Net.Caching/SqlSugar/SqlSugarRedisCache.cs deleted file mode 100644 index 97f9a8b3..00000000 --- a/CoreCms.Net.Caching/SqlSugar/SqlSugarRedisCache.cs +++ /dev/null @@ -1,70 +0,0 @@ -using SqlSugar; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using CoreCms.Net.Caching.Redis; -using StackExchange.Redis; -using CoreCms.Net.Configuration; - -namespace CoreCms.Net.Caching.SqlSugar -{ - public class SqlSugarRedisCache : ICacheService - { - //readonly RedisCacheManager _service = null; - - static readonly RedisCacheManager _service = new RedisCacheManager(); - - public SqlSugarRedisCache() - { - //_service = new RedisCacheManager(); ; - } - - public void Add(string key, TV value) - { - _service.Set(key, value); - } - - public void Add(string key, TV value, int cacheDurationInSeconds) - { - _service.Set(key, value, cacheDurationInSeconds); - } - - public bool ContainsKey(string key) - { - return _service.Exists(key); - } - - public TV Get(string key) - { - return _service.Get(key); - } - - public IEnumerable GetAllKey() - { - - return _service.SearchCacheRegex("SqlSugarDataCache.*"); - } - - public TV GetOrCreate(string cacheKey, Func create, int cacheDurationInSeconds = int.MaxValue) - { - if (this.ContainsKey(cacheKey)) - { - return this.Get(cacheKey); - } - else - { - var result = create(); - this.Add(cacheKey, result, cacheDurationInSeconds); - return result; - } - } - - public void Remove(string key) - { - _service.Remove(key); - } - } - -} \ No newline at end of file diff --git a/CoreCms.Net.Core/Config/SqlSugarSetup.cs b/CoreCms.Net.Core/Config/SqlSugarSetup.cs index 0ee70a9c..636b0074 100644 --- a/CoreCms.Net.Core/Config/SqlSugarSetup.cs +++ b/CoreCms.Net.Core/Config/SqlSugarSetup.cs @@ -49,7 +49,8 @@ namespace CoreCms.Net.Core.Config db.CurrentConnectionConfig.ConfigureExternalServices = new ConfigureExternalServices() { //判断是否开启redis设置二级缓存方式 - DataInfoCacheService = AppSettingsConstVars.RedisUseCache ? (ICacheService)new SqlSugarRedisCache() : new SqlSugarMemoryCache() + //DataInfoCacheService = AppSettingsConstVars.RedisUseCache ? (ICacheService)new SqlSugarRedisCache() : new SqlSugarMemoryCache() + DataInfoCacheService = new SqlSugarCache() }; db.CurrentConnectionConfig.MoreSettings = new ConnMoreSettings() { diff --git a/CoreCms.Net.Utility/CoreCms.Net.Utility.csproj b/CoreCms.Net.Utility/CoreCms.Net.Utility.csproj index 25c5f9c5..8c3bb097 100644 --- a/CoreCms.Net.Utility/CoreCms.Net.Utility.csproj +++ b/CoreCms.Net.Utility/CoreCms.Net.Utility.csproj @@ -5,6 +5,7 @@ + diff --git a/CoreCms.Net.Utility/Storage.cs b/CoreCms.Net.Utility/Storage.cs new file mode 100644 index 00000000..8947523e --- /dev/null +++ b/CoreCms.Net.Utility/Storage.cs @@ -0,0 +1,55 @@ +using Autofac; +using Microsoft.Extensions.Configuration; + +namespace CoreCms.Net.Utility +{ + + public static class Storage + { + /// + /// 静态构造函数 + /// + static Storage() + { + //var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()) + // .AddJsonFile("appsettings.json", true, true); + //Configuration = builder.Build(); + + //Assemblys = DependencyContext.Default.CompileLibraries + // .Where(x => x.Type == "project") + // .Select(x => AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(x.Name))) + // .ToList(); + } + + + + /// + /// 配置文件的根节点 + /// + public static IConfigurationRoot Configuration { get; } + + /// + /// 全局程序集 + /// + //public static List Assemblys { get; } + + + /// + /// Autofac依赖注入静态服务 + /// + public static ILifetimeScope Container; + + /// + /// 获取服务(Single) + /// + /// 接口类型 + /// + public static T GetService() where T : class + { + return Container.Resolve(); + } + + + } + +} \ No newline at end of file diff --git a/CoreCms.Net.Web.Admin/CoreCms.Net.Web.Admin.csproj b/CoreCms.Net.Web.Admin/CoreCms.Net.Web.Admin.csproj index 3bcf5752..79cffebb 100644 --- a/CoreCms.Net.Web.Admin/CoreCms.Net.Web.Admin.csproj +++ b/CoreCms.Net.Web.Admin/CoreCms.Net.Web.Admin.csproj @@ -48,6 +48,9 @@ + + + diff --git a/CoreCms.Net.Web.Admin/NLog.config b/CoreCms.Net.Web.Admin/NLog.config index c653280d..42eb752b 100644 --- a/CoreCms.Net.Web.Admin/NLog.config +++ b/CoreCms.Net.Web.Admin/NLog.config @@ -14,7 +14,7 @@ dbProvider="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient" connectionString="Server=127.0.0.1;Database=BaseMIS;User ID=sa;Password=123456" --> - + INSERT INTO SysNLogRecords (LogDate,LogLevel,LogType,LogTitle,Logger,Message,MachineName,MachineIp,NetRequestMethod diff --git a/CoreCms.Net.Web.Admin/Program.cs b/CoreCms.Net.Web.Admin/Program.cs index ffa9c00d..9419cf4f 100644 --- a/CoreCms.Net.Web.Admin/Program.cs +++ b/CoreCms.Net.Web.Admin/Program.cs @@ -26,6 +26,8 @@ using CoreCms.Net.Filter; using CoreCms.Net.Mapping; using CoreCms.Net.Middlewares; using CoreCms.Net.Swagger; +using CoreCms.Net.Utility; +using EasyCaching.Core; using Microsoft.Extensions.DependencyInjection.Extensions; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; @@ -131,7 +133,25 @@ YitIdHelper.SetIdGenerator(options); //var newId = YitIdHelper.NextId(); +#region 缓存配置 +string cacheProviderName = "default"; +builder.Services.AddEasyCaching(options => +{ + ////使用文档 https://easycaching.readthedocs.io/en/latest + if (AppSettingsConstVars.RedisUseCache) + { + options.UseCSRedis(builder.Configuration); + cacheProviderName = EasyCachingConstValue.DefaultCSRedisName; + } + else + { + cacheProviderName = EasyCachingConstValue.DefaultInMemoryName; + options.UseInMemory(builder.Configuration); + } + options.WithJson(cacheProviderName); +}); +#endregion #region AutoFac注册============================================================================ @@ -179,6 +199,8 @@ app.UseRequestResponseLog(); app.UseRecordAccessLogsMildd(GlobalEnumVars.CoreShopSystemCategory.Admin.ToString()); // 记录ip请求 (注意开启权限,不然本地无法写入) app.UseIpLogMildd(); +//注册csredis中间件处理 +Storage.Container = app.Services.CreateScope().ServiceProvider.GetAutofacRoot(); #endregion app.UseSwagger().UseSwaggerUI(c => diff --git a/CoreCms.Net.Web.Admin/appsettings.json b/CoreCms.Net.Web.Admin/appsettings.json index f758cd66..6d7512ee 100644 --- a/CoreCms.Net.Web.Admin/appsettings.json +++ b/CoreCms.Net.Web.Admin/appsettings.json @@ -15,6 +15,8 @@ }, "AppConfig": { "AppUrl": "https://admin.test.pro.coreshop.cn/", //后端管理地址 + "AppPcUrl": "https://pc.test.pro.coreshop.cn/", //PC端访问地址 + "AppH5Url": "https://h5.test.pro.coreshop.cn/", //H5端访问地址 "AppInterFaceUrl": "https://api.test.pro.coreshop.cn/", //接口请求地址 "AppVersion": "CoreShopProfessional v0.6.7" }, @@ -23,7 +25,38 @@ "UseCache": true, //启用redis作为内存选择 "UseTimedTask": true, //启用redis作为定时任务 // 如果采用容器化部署Service 要写成redis的服务名,否则写地址 - "ConnectionString": "127.0.0.1:6379,password=coreshop,connectTimeout=30000,responseTimeout=30000,abortConnect=false,connectRetry=1,syncTimeout=10000,DefaultDatabase=9" //redis数据库连接字符串 + "ConnectionString": "127.0.0.1:6379,password=,connectTimeout=30000,responseTimeout=30000,abortConnect=false,connectRetry=1,syncTimeout=10000,DefaultDatabase=9" //redis数据库连接字符串 + }, + "easycaching": { + "csredis": { + "MaxRdSecond": 0, //预防缓存在同一时间全部失效,可以为每个key的过期时间添加一个随机的秒数,默认值是120秒 + "EnableLogging": false, // 是否开启日志,默认值是false + "LockMs": 5000, // 互斥锁的存活时间, 默认值是5000毫秒 + "SleepMs": 300, // 没有获取到互斥锁时的休眠时间,默认值是300毫秒 + "dbconfig": { + "ConnectionStrings": [ + "127.0.0.1:6379,password=,connectTimeout=30000,responseTimeout=30000,abortConnect=false,connectRetry=1,syncTimeout=10000,DefaultDatabase=9" //如果没有密码请保持为空 + ], + //"Sentinels": [ + // "192.169.1.10:26379", + // "192.169.1.11:26379", + // "192.169.1.12:26379" + //], + "ReadOnly": false + } + }, + "inmemory": { + "MaxRdSecond": 0, + "EnableLogging": false, + "LockMs": 5000, + "SleepMs": 300, + "DBConfig": { + "SizeLimit": 10000, + "ExpirationScanFrequency": 60, // InMemory的过期扫描频率,默认值是60秒 + "EnableReadDeepClone": true, + "EnableWriteDeepClone": false + } + } }, //jwt授权认证的一些设置 "JwtConfig": { diff --git a/CoreCms.Net.Web.WebApi/CoreCms.Net.Web.WebApi.csproj b/CoreCms.Net.Web.WebApi/CoreCms.Net.Web.WebApi.csproj index f2d96c0c..2e927b55 100644 --- a/CoreCms.Net.Web.WebApi/CoreCms.Net.Web.WebApi.csproj +++ b/CoreCms.Net.Web.WebApi/CoreCms.Net.Web.WebApi.csproj @@ -52,6 +52,9 @@ + + + diff --git a/CoreCms.Net.Web.WebApi/Program.cs b/CoreCms.Net.Web.WebApi/Program.cs index 4f4dc042..d3f6fb78 100644 --- a/CoreCms.Net.Web.WebApi/Program.cs +++ b/CoreCms.Net.Web.WebApi/Program.cs @@ -12,7 +12,9 @@ using CoreCms.Net.Mapping; using CoreCms.Net.Middlewares; using CoreCms.Net.Swagger; using CoreCms.Net.Task; +using CoreCms.Net.Utility; using CoreCms.Net.WeChat.Service.Mediator; +using EasyCaching.Core; using Essensoft.Paylink.Alipay; using Essensoft.Paylink.WeChatPay; using Hangfire; @@ -142,6 +144,25 @@ YitIdHelper.SetIdGenerator(options); //var newId = YitIdHelper.NextId(); +#region 缓存配置 +string cacheProviderName = "default"; +builder.Services.AddEasyCaching(options => +{ + ////使用文档 https://easycaching.readthedocs.io/en/latest + if (AppSettingsConstVars.RedisUseCache) + { + options.UseCSRedis(builder.Configuration); + cacheProviderName = EasyCachingConstValue.DefaultCSRedisName; + } + else + { + cacheProviderName = EasyCachingConstValue.DefaultInMemoryName; + options.UseInMemory(builder.Configuration); + } + options.WithJson(cacheProviderName); + +}); +#endregion #region AutoFac注册============================================================================ @@ -189,6 +210,8 @@ app.UseRequestResponseLog(); app.UseRecordAccessLogsMildd(GlobalEnumVars.CoreShopSystemCategory.Api.ToString()); // 记录ip请求 (注意开启权限,不然本地无法写入) app.UseIpLogMildd(); +//注册csredis中间件处理 +Storage.Container = app.Services.CreateScope().ServiceProvider.GetAutofacRoot(); #endregion //强制显示中文 diff --git a/CoreCms.Net.Web.WebApi/appsettings.json b/CoreCms.Net.Web.WebApi/appsettings.json index f758cd66..6d7512ee 100644 --- a/CoreCms.Net.Web.WebApi/appsettings.json +++ b/CoreCms.Net.Web.WebApi/appsettings.json @@ -15,6 +15,8 @@ }, "AppConfig": { "AppUrl": "https://admin.test.pro.coreshop.cn/", //后端管理地址 + "AppPcUrl": "https://pc.test.pro.coreshop.cn/", //PC端访问地址 + "AppH5Url": "https://h5.test.pro.coreshop.cn/", //H5端访问地址 "AppInterFaceUrl": "https://api.test.pro.coreshop.cn/", //接口请求地址 "AppVersion": "CoreShopProfessional v0.6.7" }, @@ -23,7 +25,38 @@ "UseCache": true, //启用redis作为内存选择 "UseTimedTask": true, //启用redis作为定时任务 // 如果采用容器化部署Service 要写成redis的服务名,否则写地址 - "ConnectionString": "127.0.0.1:6379,password=coreshop,connectTimeout=30000,responseTimeout=30000,abortConnect=false,connectRetry=1,syncTimeout=10000,DefaultDatabase=9" //redis数据库连接字符串 + "ConnectionString": "127.0.0.1:6379,password=,connectTimeout=30000,responseTimeout=30000,abortConnect=false,connectRetry=1,syncTimeout=10000,DefaultDatabase=9" //redis数据库连接字符串 + }, + "easycaching": { + "csredis": { + "MaxRdSecond": 0, //预防缓存在同一时间全部失效,可以为每个key的过期时间添加一个随机的秒数,默认值是120秒 + "EnableLogging": false, // 是否开启日志,默认值是false + "LockMs": 5000, // 互斥锁的存活时间, 默认值是5000毫秒 + "SleepMs": 300, // 没有获取到互斥锁时的休眠时间,默认值是300毫秒 + "dbconfig": { + "ConnectionStrings": [ + "127.0.0.1:6379,password=,connectTimeout=30000,responseTimeout=30000,abortConnect=false,connectRetry=1,syncTimeout=10000,DefaultDatabase=9" //如果没有密码请保持为空 + ], + //"Sentinels": [ + // "192.169.1.10:26379", + // "192.169.1.11:26379", + // "192.169.1.12:26379" + //], + "ReadOnly": false + } + }, + "inmemory": { + "MaxRdSecond": 0, + "EnableLogging": false, + "LockMs": 5000, + "SleepMs": 300, + "DBConfig": { + "SizeLimit": 10000, + "ExpirationScanFrequency": 60, // InMemory的过期扫描频率,默认值是60秒 + "EnableReadDeepClone": true, + "EnableWriteDeepClone": false + } + } }, //jwt授权认证的一些设置 "JwtConfig": {