using MAX.Core.DependencyInjection;
using MAX.Core.Interfaces;
using System;
using System.Collections.Concurrent;
using System.Linq;
namespace MAX.Core.Caches;
///
/// 内存缓存
///
public class MemoryCache : ICache, ISingletonDependency
{
//private static readonly Object _locker = new object();
private readonly ConcurrentDictionary _cache = new();
public virtual void Clear()
{
_cache.Clear();
}
public virtual bool Exists(string key)
{
return _cache.ContainsKey(key);
}
public virtual T Get(string key)
{
if (Exists(key))
{
return (T)_cache[key];
}
return default;
}
public virtual TResult Get(string key, Func func)
{
if (Exists(key))
{
return (TResult)_cache[key];
}
else
{
if (func != null)
{
TResult t = func();
TryAdd(key, t);
return t;
}
}
return default;
}
public virtual bool OverlayAdd(string key, T value)
{
if (Exists(key))
{
_cache[key] = value;
}
else
{
_cache.TryAdd(key, value);
}
return true;
}
public virtual void Remove(string key)
{
_cache.TryRemove(key, out _);
}
public virtual bool TryAdd(string key, T value)
{
_cache.AddOrUpdate(key, value, (oldkey, oldvalue) => value);
return true;
}
///
/// 获取所有Key
///
///
public string[] AllKeys()
{
return _cache.Keys.ToArray();
}
}
///
/// 单例缓存抽象类
///
/// 单例对象
/// 缓存类型
public abstract class SingleInstanceLittleCache : SingleInstance, ICache where TModel : class
{
private readonly ConcurrentDictionary _cache = new();
///
/// 自定义前缀
///
//public abstract string KeyPrefix { get; }
//private string FormatKey(string key)
//{
// return KeyPrefix + key;
//}
public virtual void Clear()
{
_cache.Clear();
}
public virtual bool Exists(string key)
{
return _cache.ContainsKey(key);
}
public virtual TValue Get(string key)
{
if (Exists(key))
{
return _cache[key];
}
return default;
}
public virtual TValue Get(string key, Func func)
{
if (Exists(key))
{
return _cache[key];
}
else
{
if (func != null)
{
TValue t = func();
TryAdd(key, t);
return t;
}
}
return default;
}
public virtual bool OverlayAdd(string key, TValue value)
{
if (Exists(key))
{
_cache[key] = value;
}
else
{
_cache.TryAdd(key, value);
}
return true;
}
public virtual void Remove(string key)
{
_cache.TryRemove(key, out _);
}
public virtual bool TryAdd(string key, TValue value)
{
_cache.AddOrUpdate(key, value, (oldkey, oldvalue) => value);
return true;
}
///
/// 获取所有Key
///
///
public string[] AllKeys()
{
return _cache.Keys.ToArray();
}
}