添加缓存

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.Contract;
using HuanMeng.MiaoYu.Code.Cache;
using HuanMeng.MiaoYu.Code.Cache.Contract;
using HuanMeng.MiaoYu.Code.DataAccess;
using HuanMeng.MiaoYu.Code.TencentUtile;
@ -31,7 +32,7 @@ namespace HuanMeng.MiaoYu.Code.Base
/// <summary>
/// BLL父类
/// </summary>
public class MiaoYuBase : BLLBase<DAO>
public class MiaoYuBase : CacheBase//BLLBase<DAO>
{
public MiaoYuBase(IServiceProvider serviceProvider) : base(serviceProvider)
@ -259,7 +260,7 @@ namespace HuanMeng.MiaoYu.Code.Base
if (_miaoYuCache == null)
{
//new MiaoYuDataEntityCache<T_Character>(Dao).DataList
_miaoYuCache = new MiaoYuCache(Dao, Mapper);
_miaoYuCache = new MiaoYuCache(this);
}
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>
/// <param name="dao"></param>
public partial class MiaoYuCache(DAO dao, IMapper mapper)
public partial class MiaoYuCache(CacheBase cacheBase)
{
#region
@ -33,7 +33,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
if (Character == null)
{
//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>();
}
@ -57,8 +57,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
{
if (ModelConfig == null)
{
//ModelConfig = new MiaoYuDataEntityCache<T_Model_Config>(dao, MiaoYuCacheExtend.ModelConfigLock);
ModelConfig = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Model_Config>(dao);
ModelConfig = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<T_Model_Config>(cacheBase);
}
return ModelConfig.DataList ?? new List<T_Model_Config>();
}
@ -70,7 +69,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// <summary>
/// 角色缓存表
/// </summary>
public CharacterEntityCache? CharacterCache { get; set; }
public CommonDataEntityCache<CharacterCache>? CharacterCache { get; set; }
/// <summary>
/// 角色
/// </summary>
@ -80,8 +79,8 @@ namespace HuanMeng.MiaoYu.Code.Cache
{
if (CharacterCache == null)
{
CharacterCache = new CharacterEntityCache(dao, mapper);
CharacterCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<CharacterCache>(cacheBase);
//CharacterCache = new CharacterEntityCache(cacheBase);
}
return CharacterCache.DataList ?? new List<CharacterCache>();
}
@ -105,7 +104,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
if (ImageConfigCache == null)
{
//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>();
}
@ -131,7 +130,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
if (CharacterTypeCache == null)
{
//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>();
}
@ -156,7 +155,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
if (CharacterTypeIntimacyCache == null)
{
//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>();
}
@ -205,7 +204,13 @@ namespace HuanMeng.MiaoYu.Code.Cache
{ typeof(T_Image_Config), ImageConfigLock },
{ typeof(T_Character_Type), CharacterTypeLock },
{ typeof(T_Character_Type_Intimacy), CharacterTypeIntimacyLock },
};
/// <summary>
/// 特殊的缓存锁对象
/// </summary>
public static Dictionary<Type, object> SpecialCacheLockList { get; set; } = new Dictionary<Type, object>
{
{ typeof(CharacterCache), CharacterLock },
};
#endregion
@ -214,29 +219,35 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// 获取对应的缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dao"></param>
/// <param name="cacheBase"></param>
/// <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;
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 中
cacheLock = new object();
CacheLockList[typeof(T)] = cacheLock;
CacheLockList[typeo] = cacheLock;
}
return new MiaoYuDataEntityCache<T>(dao, cacheLock);
return new MiaoYuDataEntityCache<T>(cacheBase, cacheLock);
}
/// <summary>
/// 获取缓存数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dao"></param>
/// <param name="cacheBase"></param>
/// <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>();
}
@ -244,21 +255,44 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// 清除全部缓存
/// </summary>
/// <param name="dao"></param>
public static void ClareMiaoYuDataEntityCache(DAO dao)
public static void ClareMiaoYuDataEntityCache(CacheBase cacheBase)
{
foreach (var item in CacheLockList)
{
var t = item.Key;
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;
if (x != null)
{
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
@ -288,13 +322,13 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// <param name="imageId"></param>
/// <param name="dao"></param>
/// <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 "";
}
MiaoYuCache miaoYuCache = new MiaoYuCache(dao, null);
MiaoYuCache miaoYuCache = new MiaoYuCache(cacheBase);
return GetImageUrl(imageId, miaoYuCache);
}

View File

@ -1,5 +1,6 @@
using HuanMeng.MiaoYu.Code.Cache.Contract;
using HuanMeng.MiaoYu.Code.DataAccess;
using Microsoft.EntityFrameworkCore;
@ -9,9 +10,10 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// <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
{
public DataAccess.DAO _dao = cacheBase.Dao;
/// <summary>
/// 缓存的key
/// </summary>
@ -28,7 +30,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
/// <returns></returns>
public override List<T> GetDataList()
{
var dbSet = _dao.daoDbMiaoYu.context.Set<T>().AsNoTracking();
if (dbSet == null)
{

View File

@ -1,4 +1,6 @@
using AutoMapper;
using HuanMeng.MiaoYu.Code.Cache.Contract;
using HuanMeng.MiaoYu.Model.Dto;
using HuanMeng.MiaoYu.Model.Dto.Character;
using HuanMeng.MiaoYu.Model.Dto.Label;
@ -12,12 +14,13 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special
///
/// </summary>
/// <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>
private static object CharacterCacheLock = new object();
private IMapper mapper = cacheBase.Mapper;
/// <summary>
/// 获取缓存数据
@ -27,7 +30,7 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special
{
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)
{
return characterCaches;
@ -39,24 +42,28 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special
//查询配置表
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)
{
var modelConfig = modelConfigs.FirstOrDefault(it => it.Id == characterCache.ModelConfigId);
if (modelConfig==null)
{
modelConfig= modelConfigs.FirstOrDefault();
}
if (modelConfig != null)
{
characterCache.ModelConfig = modelConfig;

View File

@ -20,7 +20,17 @@ namespace HuanMeng.MiaoYu.Code.Other
/// <returns></returns>
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;
}
}