using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; using System.Linq; using System.Text; using SqlSugar; using System.Reflection; using System.Collections; using System.Text.RegularExpressions; namespace CacheTest { public class SugarCache : ICacheService { MemoryCacheHelper cache = new MemoryCacheHelper(); public void Add(string key, V value) { cache.Set(key, value); } public void Add(string key, V value, int cacheDurationInSeconds) { cache.Set(key, value,cacheDurationInSeconds); } public bool ContainsKey(string key) { return cache.Exists(key); } public V Get(string key) { return cache.Get(key); } public IEnumerable GetAllKey() { return cache.GetCacheKeys(); } public V GetOrCreate(string cacheKey, Func create, int cacheDurationInSeconds = int.MaxValue) { if (cache.Exists(cacheKey)) { return cache.Get(cacheKey); } else { var result = create(); cache.Set(cacheKey, result, cacheDurationInSeconds); return result; } } public void Remove(string key) { cache.Remove(key); } } public class MemoryCacheHelper { private static readonly MemoryCache Cache = new MemoryCache(new MemoryCacheOptions()); /// /// 验证缓存项是否存在 /// /// 缓存Key /// public bool Exists(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); return Cache.TryGetValue(key, out _); } /// /// 添加缓存 /// /// 缓存Key /// 缓存Value /// 滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间) /// 绝对过期时长 /// public bool Set(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte) { if (key == null) throw new ArgumentNullException(nameof(key)); if (value == null) throw new ArgumentNullException(nameof(value)); Cache.Set(key, value, new MemoryCacheEntryOptions().SetSlidingExpiration(expiresSliding) .SetAbsoluteExpiration(expiressAbsoulte)); return Exists(key); } /// /// 添加缓存 /// /// 缓存Key /// 缓存Value /// 缓存时长 /// 是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间) /// public bool Set(string key, object value, TimeSpan expiresIn, bool isSliding = false) { if (key == null) throw new ArgumentNullException(nameof(key)); if (value == null) throw new ArgumentNullException(nameof(value)); Cache.Set(key, value, isSliding ? new MemoryCacheEntryOptions().SetSlidingExpiration(expiresIn) : new MemoryCacheEntryOptions().SetAbsoluteExpiration(expiresIn)); return Exists(key); } /// /// 添加缓存 /// /// 缓存Key /// 缓存Value /// public void Set(string key, object value) { Set(key, value, TimeSpan.FromDays(1)); } /// /// 添加缓存 /// /// 缓存Key /// 缓存Value /// /// public void Set(string key, object value, TimeSpan ts) { Set(key, value, ts, false); } /// /// 添加缓存 /// /// 缓存Key /// 缓存Value /// /// public void Set(string key, object value, int seconds) { var ts = TimeSpan.FromSeconds(seconds); Set(key, value, ts, false); } #region 删除缓存 /// /// 删除缓存 /// /// 缓存Key /// public void Remove(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); Cache.Remove(key); } /// /// 批量删除缓存 /// /// public void RemoveAll(IEnumerable keys) { if (keys == null) throw new ArgumentNullException(nameof(keys)); keys.ToList().ForEach(item => Cache.Remove(item)); } #endregion #region 获取缓存 /// /// 获取缓存 /// /// 缓存Key /// public T Get(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); return Cache.Get(key); } /// /// 获取缓存 /// /// 缓存Key /// public object Get(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); return Cache.Get(key); } /// /// 获取缓存集合 /// /// 缓存Key集合 /// public IDictionary GetAll(IEnumerable keys) { if (keys == null) throw new ArgumentNullException(nameof(keys)); var dict = new Dictionary(); keys.ToList().ForEach(item => dict.Add(item, Cache.Get(item))); return dict; } #endregion /// /// 删除所有缓存 /// public void RemoveCacheAll() { var l = GetCacheKeys(); foreach (var s in l) { Remove(s); } } /// /// 删除匹配到的缓存 /// /// /// public void RemoveCacheRegex(string pattern) { IList l = SearchCacheRegex(pattern); foreach (var s in l) { Remove(s); } } /// /// 搜索 匹配到的缓存 /// /// /// public IList SearchCacheRegex(string pattern) { var cacheKeys = GetCacheKeys(); var l = cacheKeys.Where(k => Regex.IsMatch(k, pattern)).ToList(); return l.AsReadOnly(); } /// /// 获取所有缓存键 /// /// public List GetCacheKeys() { const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; var entries = Cache.GetType().GetField("_entries", flags).GetValue(Cache); var cacheItems = entries as IDictionary; var keys = new List(); if (cacheItems == null) return keys; foreach (DictionaryEntry cacheItem in cacheItems) { keys.Add(cacheItem.Key.ToString()); } return keys; } } }