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