From 37a7c95adab3a1aae61a59a743af05725478f8a2 Mon Sep 17 00:00:00 2001 From: zpc Date: Mon, 5 Aug 2024 04:01:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BC=93=E5=AD=98=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cache/CommonDataEntityCache.cs | 25 +++- .../Cache/Contract/ICacheClearData.cs | 20 +++ .../Cache/Contract/ICacheReloadData.cs | 19 +++ .../HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs | 129 +++++++++++++----- .../Cache/Special/CharacterEntityCache.cs | 33 ++--- .../Dto/Character/CharacterCache.cs | 3 +- 6 files changed, 174 insertions(+), 55 deletions(-) create mode 100644 src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/ICacheClearData.cs create mode 100644 src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/ICacheReloadData.cs diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/CommonDataEntityCache.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/CommonDataEntityCache.cs index 86fb00d..fd8775b 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Cache/CommonDataEntityCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/CommonDataEntityCache.cs @@ -1,3 +1,5 @@ +using HuanMeng.MiaoYu.Code.Cache.Contract; + using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; @@ -15,7 +17,7 @@ namespace HuanMeng.MiaoYu.Code.Cache /// /// /// - public abstract class CommonDataEntityCache(object lockObj, int cacheTime = 36000) where T : class + public abstract class CommonDataEntityCache(object lockObj, int cacheTime = 36000) : ICacheClearData, ICacheReloadData where T : class { /// /// @@ -41,6 +43,7 @@ namespace HuanMeng.MiaoYu.Code.Cache { lock (lockObj) { + tempDataList = MemoryCacheHelper.GetCache>(key); if (tempDataList == null) { tempDataList = GetDataList(); @@ -59,5 +62,25 @@ namespace HuanMeng.MiaoYu.Code.Cache /// 获取缓存数据 /// public abstract List GetDataList(); + + public bool ClearData() + { + lock (lockObj) + { + MemoryCacheHelper.DelCache(key); + _dataList = null; + } + return true; + } + + public void ReloadData() + { + lock (lockObj) + { + var tempDataList = GetDataList(); + MemoryCacheHelper.SetCache(key, tempDataList, cacheTime); + _dataList = tempDataList; + } + } } } diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/ICacheClearData.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/ICacheClearData.cs new file mode 100644 index 0000000..c1afd86 --- /dev/null +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/ICacheClearData.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HuanMeng.MiaoYu.Code.Cache.Contract +{ + /// + /// 清除缓存 + /// + public interface ICacheClearData + { + /// + /// 清除数据 + /// + /// + bool ClearData(); + } +} diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/ICacheReloadData.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/ICacheReloadData.cs new file mode 100644 index 0000000..e561517 --- /dev/null +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Contract/ICacheReloadData.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HuanMeng.MiaoYu.Code.Cache.Contract +{ + /// + /// 重新加载数据 + /// + public interface ICacheReloadData + { + /// + /// 重新加载数据 + /// + void ReloadData(); + } +} diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs index caa704a..884fcbc 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs @@ -14,15 +14,11 @@ namespace HuanMeng.MiaoYu.Code.Cache public partial class MiaoYuCache(DAO dao, IMapper mapper) { #region 角色缓存表 - /// - /// 对话角色缓存表 - /// - private static object CharacterLock = new object(); /// /// 对话角色缓存表 /// - public MiaoYuDataEntityCache? Character { get; set; } + public CommonDataEntityCache? Character { get; set; } /// /// 角色数据表 /// @@ -32,7 +28,8 @@ namespace HuanMeng.MiaoYu.Code.Cache { if (Character == null) { - Character = new MiaoYuDataEntityCache(dao, CharacterLock); + //Character = new MiaoYuDataEntityCache(dao, MiaoYuCacheExtend.CharacterLock); + Character = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(dao); } return Character.DataList ?? new List(); } @@ -41,15 +38,12 @@ namespace HuanMeng.MiaoYu.Code.Cache #endregion #region 模型缓存表 - /// - /// 模型缓存表 - /// - private static object ModelConfigLock = new object(); + /// /// 模型缓存表 /// - public MiaoYuDataEntityCache? ModelConfig { get; set; } + public CommonDataEntityCache? ModelConfig { get; set; } /// /// 模型 /// @@ -59,7 +53,8 @@ namespace HuanMeng.MiaoYu.Code.Cache { if (ModelConfig == null) { - ModelConfig = new MiaoYuDataEntityCache(dao, ModelConfigLock); + //ModelConfig = new MiaoYuDataEntityCache(dao, MiaoYuCacheExtend.ModelConfigLock); + ModelConfig = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(dao); } return ModelConfig.DataList ?? new List(); } @@ -90,15 +85,12 @@ namespace HuanMeng.MiaoYu.Code.Cache #endregion #region 图片缓存表 - /// - /// 图片缓存表 - /// - private static object ImageConfigLock = new object(); + /// /// 图片缓存表 /// - public MiaoYuDataEntityCache? ImageConfigCache { get; set; } + public CommonDataEntityCache? ImageConfigCache { get; set; } /// /// 图片 /// @@ -108,7 +100,8 @@ namespace HuanMeng.MiaoYu.Code.Cache { if (ImageConfigCache == null) { - ImageConfigCache = new MiaoYuDataEntityCache(dao, ImageConfigLock); + //ImageConfigCache = new MiaoYuDataEntityCache(dao, MiaoYuCacheExtend.ImageConfigLock); + ImageConfigCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(dao); } return ImageConfigCache.DataList ?? new List(); } @@ -118,15 +111,12 @@ namespace HuanMeng.MiaoYu.Code.Cache #region 角色类型缓存表 - /// - ///角色类型缓存表 - /// - private static object CharacterTypeLock = new object(); + /// /// 角色类型缓存表 /// - public MiaoYuDataEntityCache? CharacterTypeCache { get; set; } + public CommonDataEntityCache? CharacterTypeCache { get; set; } /// /// 角色类型 /// @@ -136,7 +126,8 @@ namespace HuanMeng.MiaoYu.Code.Cache { if (CharacterTypeCache == null) { - CharacterTypeCache = new MiaoYuDataEntityCache(dao, CharacterTypeLock); + //CharacterTypeCache = new MiaoYuDataEntityCache(dao, MiaoYuCacheExtend.CharacterTypeLock); + CharacterTypeCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(dao); } return CharacterTypeCache.DataList ?? new List(); } @@ -145,15 +136,12 @@ namespace HuanMeng.MiaoYu.Code.Cache #endregion #region 角色类型缓存表 - /// - /// 类型中的角色缓存表 - /// - private static object CharacterTypeIntimacyLock = new object(); + /// /// 类型中的角色缓存表 /// - public MiaoYuDataEntityCache? CharacterTypeIntimacyCache { get; set; } + public CommonDataEntityCache? CharacterTypeIntimacyCache { get; set; } /// /// 类型中的角色 /// @@ -163,7 +151,8 @@ namespace HuanMeng.MiaoYu.Code.Cache { if (CharacterTypeIntimacyCache == null) { - CharacterTypeIntimacyCache = new MiaoYuDataEntityCache(dao, CharacterTypeIntimacyLock); + //CharacterTypeIntimacyCache = new MiaoYuDataEntityCache(dao, MiaoYuCacheExtend.CharacterTypeIntimacyLock); + CharacterTypeIntimacyCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache(dao); } return CharacterTypeIntimacyCache.DataList ?? new List(); } @@ -177,6 +166,78 @@ namespace HuanMeng.MiaoYu.Code.Cache public static class MiaoYuCacheExtend { + #region 缓存锁 + /// + /// 对话角色缓存表 + /// + public static object CharacterLock = new object(); + + /// + /// 模型缓存表 + /// + public static object ModelConfigLock = new object(); + + /// + /// 图片缓存表 + /// + public static object ImageConfigLock = new object(); + /// + ///角色类型缓存表 + /// + public static object CharacterTypeLock = new object(); + + /// + /// 类型中的角色缓存表 + /// + public static object CharacterTypeIntimacyLock = new object(); + + /// + /// 缓存锁对象 + /// + public static Dictionary CacheLockList { get; set; } = new Dictionary + { + { typeof(T_Character), CharacterLock }, + { typeof(T_Model_Config), ModelConfigLock }, + { typeof(T_Image_Config), ImageConfigLock }, + { typeof(T_Character_Type), CharacterTypeLock }, + { typeof(T_Character_Type_Intimacy), CharacterTypeIntimacyLock }, + + }; + #endregion + + #region 缓存扩展 + /// + /// 获取对应的缓存 + /// + /// + /// + /// + public static CommonDataEntityCache GetMiaoYuDataEntityCache(DAO dao) where T : class + { + object cacheLock; + if (!CacheLockList.TryGetValue(typeof(T), out cacheLock)) + { + Console.WriteLine("没有找到锁对象==>"+typeof(T).Name); + // 创建一个新的锁对象,并添加到 CacheLockList 中 + cacheLock = new object(); + CacheLockList[typeof(T)] = cacheLock; + } + return new MiaoYuDataEntityCache(dao, cacheLock); + } + /// + /// 获取缓存数据 + /// + /// + /// + /// + public static List GetMiaoYuDataEntityCacheList(DAO dao) where T : class + { + var cache = GetMiaoYuDataEntityCache(dao); + return cache?.DataList ?? new List(); + } + #endregion + + #region 图片扩展 /// /// 获取图片 /// @@ -196,12 +257,11 @@ namespace HuanMeng.MiaoYu.Code.Cache } return ""; } - /// /// 获取图片 /// /// - /// + /// /// public static string GetImageUrl(this int imageId, DAO dao) { @@ -210,8 +270,11 @@ namespace HuanMeng.MiaoYu.Code.Cache return ""; } MiaoYuCache miaoYuCache = new MiaoYuCache(dao, null); - + return GetImageUrl(imageId, miaoYuCache); } + #endregion } + + } diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs index e64fbb3..b987781 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs @@ -18,9 +18,7 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special /// 锁 /// private static object CharacterCacheLock = new object(); - private static object ImageLock = new object(); - private static object T_Character_LabelLock = new object(); - private static object T_Character_Label_RelationLock = new object(); + /// /// 获取缓存数据 /// @@ -40,26 +38,21 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special var characteChatCounts = _dao.daoDbMiaoYu.SqlQueryList(sqlString); //查询配置表 var modelConfigs = _dao.daoDbMiaoYu.context.T_Model_Config.ToList(); - var ImageConfigCache = new MiaoYuDataEntityCache(_dao, ImageLock); - var images = ImageConfigCache.DataList; + //图片 + var images = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); //标签 - var labelCache = new MiaoYuDataEntityCache(_dao, T_Character_LabelLock); - var labels = labelCache.DataList; - var labelRelationCache = new MiaoYuDataEntityCache(_dao, T_Character_Label_RelationLock); - var labelRelations = labelRelationCache.DataList; + var labels = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); + //标签关联表 + var labelRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); //性格 - var personalityCache = new MiaoYuDataEntityCache(_dao, T_Character_LabelLock); - var personalitys = personalityCache.DataList; - var personalityRelationsCache = new MiaoYuDataEntityCache(_dao, T_Character_Label_RelationLock); - var personalityRelations = personalityRelationsCache.DataList; - - - //性格 - var typeCache = new MiaoYuDataEntityCache(_dao, T_Character_LabelLock); - var types = typeCache.DataList; - var typesRelationsCache = new MiaoYuDataEntityCache(_dao, T_Character_Label_RelationLock); - var typesRelations = typesRelationsCache.DataList; + var personalitys = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); + //性格关联表 + var personalityRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); + //分类 + var types = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); ; + //分类关联表 + var typesRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList(_dao); ; foreach (var characterCache in characterCaches) { diff --git a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs index ec89619..9e139db 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs @@ -130,9 +130,10 @@ namespace HuanMeng.MiaoYu.Model.Dto.Character .Replace("{label}", this.LabelStr) //标签 .Replace("{user_sex}", this.UserSex) ; + //去除没有意义的词 if (_system.Contains("[是一个。]")) { - _system = _system .Replace("[是一个。]", ""); + _system = _system.Replace("[是一个。]", ""); } } }