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;
}
}