using HuanMeng.DotNetCore.CacheHelper.Contract; using HuanMeng.DotNetCore.Redis; using Microsoft.EntityFrameworkCore.Metadata.Internal; using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HuanMeng.DotNetCore.CacheHelper; /// /// 缓存扩展- /// public abstract class CommonDataEntityCache : ICacheClearData, ICacheReloadData where T : class { /// /// /// protected object lockObj; /// /// 过期时间 /// protected int cacheTime; protected CommonDataEntityCache(object lockObj, int cacheTime = 36000) { this.lockObj = lockObj; this.cacheTime = cacheTime; } /// /// /// public abstract string key { get; } /// /// 缓存数据 /// protected List? _dataList; /// /// 数据 /// public virtual List DataList { get { if (_dataList == null) { var tempDataList = MemoryCacheHelper.GetCache>(key); if (tempDataList == null) { lock (lockObj) { tempDataList = MemoryCacheHelper.GetCache>(key); if (tempDataList == null) { tempDataList = GetDataList(); MemoryCacheHelper.SetCache(key, tempDataList, cacheTime); } } } _dataList = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(tempDataList)); } return _dataList ?? new List(); } } /// /// 获取缓存数据 /// public abstract List GetDataList(); public virtual bool ClearData() { lock (lockObj) { MemoryCacheHelper.DelCache(key); _dataList = null; } return true; } public virtual void ReloadData() { lock (lockObj) { var tempDataList = GetDataList(); MemoryCacheHelper.SetCache(key, tempDataList, cacheTime); _dataList = tempDataList; } } } /// /// 缓存扩展- /// public abstract class RedisDataEntityCache : CommonDataEntityCache, ICacheClearLocalData where T : class { public IDatabase database; /// /// /// protected object lockObj; /// /// 过期时间 /// protected int cacheTime; private string name; protected RedisDataEntityCache(IDatabase database, int cacheTime = 36000, string name = "") : base(new object(), cacheTime) { this.lockObj = lockObj; this.cacheTime = cacheTime; this.database = database; this.name = name; } public int index = 0; /// /// 缓存数据 /// protected List? _dataList; /// /// 数据 /// public override List DataList { get { if (_dataList == null) { start: var tempDataList = database.StringGet>(key); if (tempDataList == null) { if (database.StringSetLock($"lock:{key}", "", 5)) { if (tempDataList == null) { tempDataList = GetDataList(); if (cacheTime == 0) { database.StringSet(key, tempDataList); } else { database.StringSet(key, tempDataList, TimeSpan.FromSeconds(cacheTime)); } } //_dataList = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(tempDataList)); database.KeyDeleteAsync($"lock:{key}").Wait(); } else { index++; Thread.Sleep(500); tempDataList = database.StringGet>(key); if (tempDataList == null) { if (index < 10) { goto start; } } } } _dataList = tempDataList; } return _dataList ?? new List(); } } public virtual bool ClearData() { if (database.StringSetLock($"lock:{key}", "", 5)) { database.KeyDelete(key); _dataList = null; database.KeyDeleteAsync($"lock:{key}").Wait(); } return true; } public virtual void ReloadData() { if (database.StringSetLock($"lock:{key}", "", 5)) { var tempDataList = GetDataList(); if (cacheTime == 0) { database.StringSet(key, tempDataList); } else { database.StringSet(key, tempDataList, TimeSpan.FromSeconds(cacheTime)); } _dataList = tempDataList; database.KeyDeleteAsync($"lock:{key}").Wait(); database.StringSet($"time:{key.Replace(":", ".")}", $"刷新{name}缓存时间{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"); } } public bool ClearLocalData() { _dataList = null; return true; } }