添加缓存

This commit is contained in:
zpc 2024-08-05 14:42:53 +08:00
parent 0c95613ed4
commit 1911844256
6 changed files with 158 additions and 41 deletions

View File

@ -6,6 +6,7 @@ using HuanMeng.DotNetCore.JwtInfrastructure.Interface;
using HuanMeng.DotNetCore.MultiTenant; using HuanMeng.DotNetCore.MultiTenant;
using HuanMeng.DotNetCore.MultiTenant.Contract; using HuanMeng.DotNetCore.MultiTenant.Contract;
using HuanMeng.MiaoYu.Code.Cache; using HuanMeng.MiaoYu.Code.Cache;
using HuanMeng.MiaoYu.Code.Cache.Contract;
using HuanMeng.MiaoYu.Code.DataAccess; using HuanMeng.MiaoYu.Code.DataAccess;
using HuanMeng.MiaoYu.Code.TencentUtile; using HuanMeng.MiaoYu.Code.TencentUtile;
@ -31,7 +32,7 @@ namespace HuanMeng.MiaoYu.Code.Base
/// <summary> /// <summary>
/// BLL父类 /// BLL父类
/// </summary> /// </summary>
public class MiaoYuBase : BLLBase<DAO> public class MiaoYuBase : CacheBase//BLLBase<DAO>
{ {
public MiaoYuBase(IServiceProvider serviceProvider) : base(serviceProvider) public MiaoYuBase(IServiceProvider serviceProvider) : base(serviceProvider)
@ -259,7 +260,7 @@ namespace HuanMeng.MiaoYu.Code.Base
if (_miaoYuCache == null) if (_miaoYuCache == null)
{ {
//new MiaoYuDataEntityCache<T_Character>(Dao).DataList //new MiaoYuDataEntityCache<T_Character>(Dao).DataList
_miaoYuCache = new MiaoYuCache(Dao, Mapper); _miaoYuCache = new MiaoYuCache(this);
} }
return _miaoYuCache; return _miaoYuCache;
} }

View File

@ -0,0 +1,63 @@
using AutoMapper;
using HuanMeng.DotNetCore.Base;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HuanMeng.MiaoYu.Code.Cache.Contract
{
/// <summary>
///
/// </summary>
public class CacheBase : BLLBase<DAO>
{
public CacheBase(IServiceProvider serviceProvider) : base(serviceProvider)
{
}
#region
private DAO _dao;
/// <summary>
/// dao 数据库
/// </summary>
public override DAO Dao
{
get
{
if (_dao == null)
{
_dao = new DAO(_serviceProvider);
}
return _dao;
}
}
#endregion
#region
private IMapper _mapper;
/// <summary>
/// dto映射
/// </summary>
//[FromServices]
public virtual IMapper Mapper
{
get
{
if (_mapper == null)
{
_mapper = _serviceProvider.GetRequiredService<IMapper>();
}
return _mapper;
}
set { _mapper = value; }
}
#endregion
}
}

View File

@ -15,7 +15,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// 缓存类 /// 缓存类
/// </summary> /// </summary>
/// <param name="dao"></param> /// <param name="dao"></param>
public partial class MiaoYuCache(DAO dao, IMapper mapper) public partial class MiaoYuCache(CacheBase cacheBase)
{ {
#region #region
@ -33,7 +33,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
if (Character == null) if (Character == null)
{ {
//Character = new MiaoYuDataEntityCache<T_Character>(dao, MiaoYuCacheExtend.CharacterLock); //Character = new MiaoYuDataEntityCache<T_Character>(dao, MiaoYuCacheExtend.CharacterLock);
Character = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Character>(dao); Character = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Character>(cacheBase);
} }
return Character.DataList ?? new List<T_Character>(); return Character.DataList ?? new List<T_Character>();
} }
@ -57,8 +57,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
{ {
if (ModelConfig == null) if (ModelConfig == null)
{ {
//ModelConfig = new MiaoYuDataEntityCache<T_Model_Config>(dao, MiaoYuCacheExtend.ModelConfigLock); ModelConfig = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Model_Config>(cacheBase);
ModelConfig = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Model_Config>(dao);
} }
return ModelConfig.DataList ?? new List<T_Model_Config>(); return ModelConfig.DataList ?? new List<T_Model_Config>();
} }
@ -70,7 +69,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// <summary> /// <summary>
/// 角色缓存表 /// 角色缓存表
/// </summary> /// </summary>
public CharacterEntityCache? CharacterCache { get; set; } public CommonDataEntityCache<CharacterCache>? CharacterCache { get; set; }
/// <summary> /// <summary>
/// 角色 /// 角色
/// </summary> /// </summary>
@ -80,8 +79,8 @@ namespace HuanMeng.MiaoYu.Code.Cache
{ {
if (CharacterCache == null) if (CharacterCache == null)
{ {
CharacterCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<CharacterCache>(cacheBase);
CharacterCache = new CharacterEntityCache(dao, mapper); //CharacterCache = new CharacterEntityCache(cacheBase);
} }
return CharacterCache.DataList ?? new List<CharacterCache>(); return CharacterCache.DataList ?? new List<CharacterCache>();
} }
@ -105,7 +104,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
if (ImageConfigCache == null) if (ImageConfigCache == null)
{ {
//ImageConfigCache = new MiaoYuDataEntityCache<T_Image_Config>(dao, MiaoYuCacheExtend.ImageConfigLock); //ImageConfigCache = new MiaoYuDataEntityCache<T_Image_Config>(dao, MiaoYuCacheExtend.ImageConfigLock);
ImageConfigCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Image_Config>(dao); ImageConfigCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Image_Config>(cacheBase);
} }
return ImageConfigCache.DataList ?? new List<T_Image_Config>(); return ImageConfigCache.DataList ?? new List<T_Image_Config>();
} }
@ -131,7 +130,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
if (CharacterTypeCache == null) if (CharacterTypeCache == null)
{ {
//CharacterTypeCache = new MiaoYuDataEntityCache<T_Character_Type>(dao, MiaoYuCacheExtend.CharacterTypeLock); //CharacterTypeCache = new MiaoYuDataEntityCache<T_Character_Type>(dao, MiaoYuCacheExtend.CharacterTypeLock);
CharacterTypeCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Character_Type>(dao); CharacterTypeCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Character_Type>(cacheBase);
} }
return CharacterTypeCache.DataList ?? new List<T_Character_Type>(); return CharacterTypeCache.DataList ?? new List<T_Character_Type>();
} }
@ -156,7 +155,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
if (CharacterTypeIntimacyCache == null) if (CharacterTypeIntimacyCache == null)
{ {
//CharacterTypeIntimacyCache = new MiaoYuDataEntityCache<T_Character_Type_Intimacy>(dao, MiaoYuCacheExtend.CharacterTypeIntimacyLock); //CharacterTypeIntimacyCache = new MiaoYuDataEntityCache<T_Character_Type_Intimacy>(dao, MiaoYuCacheExtend.CharacterTypeIntimacyLock);
CharacterTypeIntimacyCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Character_Type_Intimacy>(dao); CharacterTypeIntimacyCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Character_Type_Intimacy>(cacheBase);
} }
return CharacterTypeIntimacyCache.DataList ?? new List<T_Character_Type_Intimacy>(); return CharacterTypeIntimacyCache.DataList ?? new List<T_Character_Type_Intimacy>();
} }
@ -205,7 +204,13 @@ namespace HuanMeng.MiaoYu.Code.Cache
{ typeof(T_Image_Config), ImageConfigLock }, { typeof(T_Image_Config), ImageConfigLock },
{ typeof(T_Character_Type), CharacterTypeLock }, { typeof(T_Character_Type), CharacterTypeLock },
{ typeof(T_Character_Type_Intimacy), CharacterTypeIntimacyLock }, { typeof(T_Character_Type_Intimacy), CharacterTypeIntimacyLock },
};
/// <summary>
/// 特殊的缓存锁对象
/// </summary>
public static Dictionary<Type, object> SpecialCacheLockList { get; set; } = new Dictionary<Type, object>
{
{ typeof(CharacterCache), CharacterLock },
}; };
#endregion #endregion
@ -214,29 +219,35 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// 获取对应的缓存 /// 获取对应的缓存
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T"></typeparam>
/// <param name="dao"></param> /// <param name="cacheBase"></param>
/// <returns></returns> /// <returns></returns>
public static CommonDataEntityCache<T> GetMiaoYuDataEntityCache<T>(DAO dao) where T : class public static CommonDataEntityCache<T> GetMiaoYuDataEntityCache<T>(CacheBase cacheBase) where T : class
{ {
object cacheLock; object cacheLock;
if (!CacheLockList.TryGetValue(typeof(T), out cacheLock)) var typeo = typeof(T);
if (SpecialCacheLockList.TryGetValue(typeo, out cacheLock))
{ {
Console.WriteLine("没有找到锁对象==>" + typeof(T).Name); var o = new CharacterEntityCache(cacheBase, cacheLock) as CommonDataEntityCache<T>;
return o;
}
if (!CacheLockList.TryGetValue(typeo, out cacheLock))
{
Console.WriteLine("没有找到锁对象==>" + typeo.Name);
// 创建一个新的锁对象,并添加到 CacheLockList 中 // 创建一个新的锁对象,并添加到 CacheLockList 中
cacheLock = new object(); cacheLock = new object();
CacheLockList[typeof(T)] = cacheLock; CacheLockList[typeo] = cacheLock;
} }
return new MiaoYuDataEntityCache<T>(dao, cacheLock); return new MiaoYuDataEntityCache<T>(cacheBase, cacheLock);
} }
/// <summary> /// <summary>
/// 获取缓存数据 /// 获取缓存数据
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T"></typeparam>
/// <param name="dao"></param> /// <param name="cacheBase"></param>
/// <returns></returns> /// <returns></returns>
public static List<T> GetMiaoYuDataEntityCacheList<T>(DAO dao) where T : class public static List<T> GetMiaoYuDataEntityCacheList<T>(CacheBase cacheBase) where T : class
{ {
var cache = GetMiaoYuDataEntityCache<T>(dao); var cache = GetMiaoYuDataEntityCache<T>(cacheBase);
return cache?.DataList ?? new List<T>(); return cache?.DataList ?? new List<T>();
} }
@ -244,21 +255,44 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// 清除全部缓存 /// 清除全部缓存
/// </summary> /// </summary>
/// <param name="dao"></param> /// <param name="dao"></param>
public static void ClareMiaoYuDataEntityCache(DAO dao) public static void ClareMiaoYuDataEntityCache(CacheBase cacheBase)
{ {
foreach (var item in CacheLockList) foreach (var item in CacheLockList)
{ {
var t = item.Key; var t = item.Key;
Type cacheType = typeof(MiaoYuDataEntityCache<>).MakeGenericType(t); Type cacheType = typeof(MiaoYuDataEntityCache<>).MakeGenericType(t);
var shujuduixiang = Activator.CreateInstance(cacheType, dao, item.Value,36000); var shujuduixiang = Activator.CreateInstance(cacheType, cacheBase, item.Value, 36000);
var x = shujuduixiang as ICacheClearData; var x = shujuduixiang as ICacheClearData;
if (x != null) if (x != null)
{ {
x.ClearData(); x.ClearData();
} }
//new MiaoYuDataEntityCache<T>(dao, cacheLock);
//Activator.CreateInstance(t);
} }
var obj = SpecialCacheLockList[typeof(CharacterEntityCache)];
CharacterEntityCache characterEntityCache = new CharacterEntityCache(cacheBase, obj);
characterEntityCache.ClearData();
}
/// <summary>
/// 刷新部缓存
/// </summary>
/// <param name="dao"></param>
public static void ReloadMiaoYuDataEntityCache(CacheBase cacheBase)
{
foreach (var item in CacheLockList)
{
var t = item.Key;
Type cacheType = typeof(MiaoYuDataEntityCache<>).MakeGenericType(t);
var shujuduixiang = Activator.CreateInstance(cacheType, cacheBase, item.Value, 36000);
var x = shujuduixiang as ICacheReloadData;
if (x != null)
{
x.ReloadData();
}
}
var obj = SpecialCacheLockList[typeof(CharacterEntityCache)];
CharacterEntityCache characterEntityCache = new CharacterEntityCache(cacheBase, obj);
characterEntityCache.ReloadData();
} }
#endregion #endregion
@ -288,13 +322,13 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// <param name="imageId"></param> /// <param name="imageId"></param>
/// <param name="dao"></param> /// <param name="dao"></param>
/// <returns></returns> /// <returns></returns>
public static string GetImageUrl(this int imageId, DAO dao) public static string GetImageUrl(this int imageId, CacheBase cacheBase)
{ {
if (imageId == 0 || dao == null) if (imageId == 0 || cacheBase == null)
{ {
return ""; return "";
} }
MiaoYuCache miaoYuCache = new MiaoYuCache(dao, null); MiaoYuCache miaoYuCache = new MiaoYuCache(cacheBase);
return GetImageUrl(imageId, miaoYuCache); return GetImageUrl(imageId, miaoYuCache);
} }

View File

@ -1,5 +1,6 @@
using HuanMeng.MiaoYu.Code.Cache.Contract;
using HuanMeng.MiaoYu.Code.DataAccess; using HuanMeng.MiaoYu.Code.DataAccess;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -9,9 +10,10 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// <summary> /// <summary>
/// 妙语数据库实体类缓存 /// 妙语数据库实体类缓存
/// </summary> /// </summary>
public class MiaoYuDataEntityCache<T>(DAO _dao, object lockObj, int cacheTime = 36000) public class MiaoYuDataEntityCache<T>(CacheBase cacheBase, object lockObj, int cacheTime = 36000)
: CommonDataEntityCache<T>(lockObj, cacheTime) where T : class : CommonDataEntityCache<T>(lockObj, cacheTime) where T : class
{ {
public DataAccess.DAO _dao = cacheBase.Dao;
/// <summary> /// <summary>
/// 缓存的key /// 缓存的key
/// </summary> /// </summary>
@ -28,7 +30,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// <returns></returns> /// <returns></returns>
public override List<T> GetDataList() public override List<T> GetDataList()
{ {
var dbSet = _dao.daoDbMiaoYu.context.Set<T>().AsNoTracking(); var dbSet = _dao.daoDbMiaoYu.context.Set<T>().AsNoTracking();
if (dbSet == null) if (dbSet == null)
{ {

View File

@ -1,4 +1,6 @@
using AutoMapper; using AutoMapper;
using HuanMeng.MiaoYu.Code.Cache.Contract;
using HuanMeng.MiaoYu.Model.Dto; using HuanMeng.MiaoYu.Model.Dto;
using HuanMeng.MiaoYu.Model.Dto.Character; using HuanMeng.MiaoYu.Model.Dto.Character;
using HuanMeng.MiaoYu.Model.Dto.Label; using HuanMeng.MiaoYu.Model.Dto.Label;
@ -12,12 +14,13 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special
/// ///
/// </summary> /// </summary>
/// <param name="_dao"></param> /// <param name="_dao"></param>
public class CharacterEntityCache(DAO _dao, IMapper mapper) : MiaoYuDataEntityCache<CharacterCache>(_dao, CharacterCacheLock) public class CharacterEntityCache(CacheBase cacheBase, object CharacterCacheLock) : MiaoYuDataEntityCache<CharacterCache>(cacheBase, CharacterCacheLock)
{ {
/// <summary> /// <summary>
/// 锁 /// 锁
/// </summary> /// </summary>
private static object CharacterCacheLock = new object(); private static object CharacterCacheLock = new object();
private IMapper mapper = cacheBase.Mapper;
/// <summary> /// <summary>
/// 获取缓存数据 /// 获取缓存数据
@ -27,7 +30,7 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special
{ {
List<CharacterCache> characterCaches = new List<CharacterCache>(); List<CharacterCache> characterCaches = new List<CharacterCache>();
//读取角色表 //读取角色表
var characters = _dao.daoDbMiaoYu.context.T_Character.Where(it=>it.Visibility).ToList(); var characters = _dao.daoDbMiaoYu.context.T_Character.Where(it => it.Visibility).ToList();
if (characters == null) if (characters == null)
{ {
return characterCaches; return characterCaches;
@ -39,24 +42,28 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special
//查询配置表 //查询配置表
var modelConfigs = _dao.daoDbMiaoYu.context.T_Model_Config.ToList(); var modelConfigs = _dao.daoDbMiaoYu.context.T_Model_Config.ToList();
//图片 //图片
var images = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Image_Config>(_dao); var images = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Image_Config>(cacheBase);
//标签 //标签
var labels = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Label>(_dao); var labels = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Label>(cacheBase);
//标签关联表 //标签关联表
var labelRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Label_Relation>(_dao); var labelRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Label_Relation>(cacheBase);
//性格 //性格
var personalitys = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Personality>(_dao); var personalitys = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Personality>(cacheBase);
//性格关联表 //性格关联表
var personalityRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Personality_Relation>(_dao); var personalityRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Personality_Relation>(cacheBase);
//分类 //分类
var types = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Type>(_dao); ; var types = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Type>(cacheBase); ;
//分类关联表 //分类关联表
var typesRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Type_Intimacy>(_dao); ; var typesRelations = MiaoYuCacheExtend.GetMiaoYuDataEntityCacheList<T_Character_Type_Intimacy>(cacheBase); ;
foreach (var characterCache in characterCaches) foreach (var characterCache in characterCaches)
{ {
var modelConfig = modelConfigs.FirstOrDefault(it => it.Id == characterCache.ModelConfigId); var modelConfig = modelConfigs.FirstOrDefault(it => it.Id == characterCache.ModelConfigId);
if (modelConfig==null)
{
modelConfig= modelConfigs.FirstOrDefault();
}
if (modelConfig != null) if (modelConfig != null)
{ {
characterCache.ModelConfig = modelConfig; characterCache.ModelConfig = modelConfig;

View File

@ -20,7 +20,17 @@ namespace HuanMeng.MiaoYu.Code.Other
/// <returns></returns> /// <returns></returns>
public Task CleraCache() public Task CleraCache()
{ {
MiaoYuCacheExtend.ClareMiaoYuDataEntityCache(Dao); MiaoYuCacheExtend.ClareMiaoYuDataEntityCache(this);
return Task.CompletedTask;
}
/// <summary>
/// 刷新缓存
/// </summary>
/// <returns></returns>
public Task ReloadCache()
{
MiaoYuCacheExtend.ReloadMiaoYuDataEntityCache(this);
return Task.CompletedTask; return Task.CompletedTask;
} }
} }