添加缓存

This commit is contained in:
zpc 2024-07-13 16:29:27 +08:00
parent 5263badb1a
commit af016b57e5
7 changed files with 164 additions and 21 deletions

View File

@ -4,6 +4,7 @@ using HuanMeng.DotNetCore.Base;
using HuanMeng.DotNetCore.JwtInfrastructure; using HuanMeng.DotNetCore.JwtInfrastructure;
using HuanMeng.DotNetCore.JwtInfrastructure.Interface; using HuanMeng.DotNetCore.JwtInfrastructure.Interface;
using HuanMeng.DotNetCore.MultiTenant; using HuanMeng.DotNetCore.MultiTenant;
using HuanMeng.MiaoYu.Code.Cache;
using HuanMeng.MiaoYu.Code.DataAccess; using HuanMeng.MiaoYu.Code.DataAccess;
using HuanMeng.MiaoYu.Code.TencentUtile; using HuanMeng.MiaoYu.Code.TencentUtile;
using HuanMeng.MiaoYu.Code.Users.UserAccount; using HuanMeng.MiaoYu.Code.Users.UserAccount;
@ -216,5 +217,25 @@ namespace HuanMeng.MiaoYu.Code.Base
} }
} }
#endregion #endregion
#region
private MiaoYuCache? _miaoYuCache;
/// <summary>
/// 妙语实现类
/// </summary>
public MiaoYuCache MiaoYuCache
{
get
{
if (_miaoYuCache == null)
{
//new MiaoYuDataEntityCache<T_Character>(Dao).DataList
_miaoYuCache = new MiaoYuCache(Dao);
}
return _miaoYuCache;
}
}
#endregion
} }
} }

View File

@ -0,0 +1,61 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XLib.DotNetCore.CacheHelper;
namespace HuanMeng.MiaoYu.Code.Cache
{
/// <summary>
///
/// </summary>
public abstract class CommonDataEntityCache<T>(object lockObj, int cacheTime = 36000) where T : class
{
/// <summary>
///
/// </summary>
public abstract string key { get; }
/// <summary>
/// 缓存数据
/// </summary>
protected List<T>? _dataList;
/// <summary>
/// 数据
/// </summary>
public List<T> DataList
{
get
{
if (_dataList == null)
{
_dataList = MemoryCacheHelper.GetCache<List<T>>(key);
if (_dataList == null)
{
lock (lockObj)
{
if (_dataList == null)
{
_dataList = GetDataList();
MemoryCacheHelper.SetCache(key, _dataList, cacheTime);
}
}
}
}
return _dataList ?? new List<T>();
}
}
/// <summary>
/// 获取缓存数据
/// </summary>
public abstract List<T> GetDataList();
}
}

View File

@ -0,0 +1,38 @@
namespace HuanMeng.MiaoYu.Code.Cache
{
/// <summary>
/// 缓存类
/// </summary>
/// <param name="dao"></param>
public partial class MiaoYuCache(DAO dao)
{
#region
/// <summary>
/// 对话角色缓存表
/// </summary>
private static object CharacterLock = new object();
/// <summary>
/// 对话角色缓存表
/// </summary>
public MiaoYuDataEntityCache<T_Character>? Character { get; set; }
/// <summary>
/// 角色数据表
/// </summary>
public List<T_Character> CharactersList
{
get
{
if (Character == null)
{
Character = new MiaoYuDataEntityCache<T_Character>(dao, CharacterLock);
}
return Character.DataList ?? new List<T_Character>();
}
}
#endregion
}
}

View File

@ -1,16 +1,35 @@
using HuanMeng.MiaoYu.Code.DataAccess;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HuanMeng.MiaoYu.Code.Cache namespace HuanMeng.MiaoYu.Code.Cache
{ {
/// <summary> /// <summary>
/// 妙语数据库实体类缓存 /// 妙语数据库实体类缓存
/// </summary> /// </summary>
public class MiaoYuDataEntityCache<T>(DAO _dAO) where T : class public class MiaoYuDataEntityCache<T>(DAO _dao, object lockObj, int cacheTime = 36000)
: CommonDataEntityCache<T>(lockObj, cacheTime) where T : class
{ {
/// <summary>
/// 缓存的key
/// </summary>
public override string key
{
get
{
return $"{_dao.daoDbMiaoYu.context.TenantInfo?.TenantId}:MiaoYu:{typeof(T).Name}";
}
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public override List<T> GetDataList()
{
var dbSet = _dao.daoDbMiaoYu.context.Set<T>();
if (dbSet == null)
{
return new List<T>();
}
return dbSet.ToList();
}
} }
} }

View File

@ -2,8 +2,10 @@ using HuanMeng.DotNetCore.Base;
using HuanMeng.MiaoYu.Code.Cache; using HuanMeng.MiaoYu.Code.Cache;
using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu;
using HuanMeng.MiaoYu.Model.Dto.Home; using HuanMeng.MiaoYu.Model.Dto.Home;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -17,11 +19,11 @@ namespace HuanMeng.MiaoYu.Code.Chat
/// </summary> /// </summary>
public class ChatBLL : MiaoYuBase public class ChatBLL : MiaoYuBase
{ {
private readonly CharacterInfoBaseCache _characterCache;
public ChatBLL(IServiceProvider serviceProvider, CharacterInfoBaseCache characterCache) : base(serviceProvider)
public ChatBLL(IServiceProvider serviceProvider) : base(serviceProvider)
{ {
_characterCache = characterCache;
} }
//public async Task<CharacterInfoDto> GetCharacterInfo() //public async Task<CharacterInfoDto> GetCharacterInfo()
@ -34,19 +36,19 @@ namespace HuanMeng.MiaoYu.Code.Chat
/// <param name="id">聊天id</param> /// <param name="id">聊天id</param>
/// <param name="characterId"></param> /// <param name="characterId"></param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> DelChatByIds(List<int> id,int characterId) public async Task<bool> DelChatByIds(List<int> id, int characterId)
{ {
//var charactersList = MiaoYuCache.CharactersList;
List<T_Character> list = _characterCache.GetCharacterFromCache(characterId); //List<T_Character> list = _characterCache.GetCharacterFromCache(characterId);
var chatsToDelete = await Dao.daoDbMiaoYu.context.T_Chat.Where(t => id.Contains(t.Id)).ToListAsync(); var chatsToDelete = await Dao.daoDbMiaoYu.context.T_Chat.Where(t => id.Contains(t.Id)).ToListAsync();
if (chatsToDelete.Count <= 0) if (chatsToDelete.Count <= 0)
{ {
throw new Exception(""); throw new Exception("");
} }
var chatList = chatsToDelete.Where(t => t.UserId == _UserId && t.CharacterId == characterId && t.IsDel == false).ToList(); var chatList = chatsToDelete.Where(t => t.UserId == _UserId && t.CharacterId == characterId && t.IsDel == false).ToList();
if (chatList.Count > 0) if (chatList.Count > 0)
{ {
chatList.ForEach(t=>t.IsDel = true); chatList.ForEach(t => t.IsDel = true);
} }
Dao.daoDbMiaoYu.context.SaveChanges(); Dao.daoDbMiaoYu.context.SaveChanges();
return true; return true;
@ -59,7 +61,7 @@ namespace HuanMeng.MiaoYu.Code.Chat
/// <returns></returns> /// <returns></returns>
public async Task<bool> DelChat(int characterId) public async Task<bool> DelChat(int characterId)
{ {
var tempList = await Dao.daoDbMiaoYu.context.T_Chat.Where(t=>t.UserId == _UserId && t.CharacterId==characterId && t.IsDel == false).ToListAsync(); var tempList = await Dao.daoDbMiaoYu.context.T_Chat.Where(t => t.UserId == _UserId && t.CharacterId == characterId && t.IsDel == false).ToListAsync();
if (tempList.Count > 0) if (tempList.Count > 0)
{ {
tempList.ForEach(t => t.IsDel = true); tempList.ForEach(t => t.IsDel = true);

View File

@ -1 +1,3 @@
global using HuanMeng.MiaoYu.Code.Base; global using HuanMeng.MiaoYu.Code.Base;
global using HuanMeng.MiaoYu.Code.DataAccess;
global using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu;

View File

@ -18,14 +18,14 @@ namespace HuanMeng.MiaoYu.WebApi.Controllers
[ApiController] [ApiController]
public class ChatController : MiaoYuControllerBase public class ChatController : MiaoYuControllerBase
{ {
private readonly ChatBLL _chatBLL; private ChatBLL _chatBLL;
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
/// <param name="_serviceProvider"></param> /// <param name="_serviceProvider"></param>
public ChatController(IServiceProvider _serviceProvider, ChatBLL chatBLL) : base(_serviceProvider) public ChatController(IServiceProvider _serviceProvider) : base(_serviceProvider)
{ {
_chatBLL= chatBLL; _chatBLL = new ChatBLL(_serviceProvider);
} }
/// <summary> /// <summary>