using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; using CoreCms.Net.Caching.Manual; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; namespace CoreCms.Net.Caching.MemoryCache { public class MemoryCacheManager : IManualCacheManager { private static volatile Microsoft.Extensions.Caching.Memory.MemoryCache _memoryCache = new Microsoft.Extensions.Caching.Memory.MemoryCache((IOptions)new MemoryCacheOptions()); /// /// 验证缓存项是否存在 /// /// 缓存Key /// public bool Exists(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); return _memoryCache.TryGetValue(key, out _); } /// /// 添加缓存 /// /// 缓存Key /// 缓存Value /// 缓存时间 /// public bool Set(string key, object value, int expiresIn = 0) { if (key == null) throw new ArgumentNullException(nameof(key)); if (value == null) throw new ArgumentNullException(nameof(value)); if (expiresIn > 0) { _memoryCache.Set(key, value, new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(120)) .SetAbsoluteExpiration(TimeSpan.FromMinutes(expiresIn))); } else { _memoryCache.Set(key, value, new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(120)) .SetAbsoluteExpiration(TimeSpan.FromMinutes(1440))); } return Exists(key); } /// /// 删除缓存 /// /// 缓存Key /// public void Remove(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); _memoryCache.Remove(key); } /// /// 批量删除缓存 /// /// public void RemoveAll(IEnumerable keys) { if (keys == null) throw new ArgumentNullException(nameof(keys)); keys.ToList().ForEach(item => _memoryCache.Remove(item)); } /// /// 获取缓存对象 /// /// 缓存Key /// public T Get(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); return _memoryCache.Get(key); } /// /// 获取缓存 /// /// 缓存Key /// public object Get(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); return _memoryCache.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, _memoryCache.Get(item))); return dict; } /// /// 删除所有缓存 /// 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 = _memoryCache.GetType().GetField("_entries", flags).GetValue(_memoryCache); 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; } } }