| using Microsoft.Extensions.Caching.Distributed; | 
| using Microsoft.Extensions.Caching.Memory; | 
| using Newtonsoft.Json; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
| using WIDESEA_Core.Const; | 
|   | 
| namespace WIDESEA_Core.Caches | 
| { | 
|     /// <summary> | 
|     /// 实例化缓存接口ICaching | 
|     /// </summary> | 
|     public class Caching : ICaching | 
|     { | 
|         private readonly IDistributedCache _cache; | 
|   | 
|         public Caching(IDistributedCache cache) | 
|         { | 
|             _cache = cache; | 
|         } | 
|   | 
|         private byte[] GetBytes<T>(T source) | 
|         { | 
|             return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(source)); | 
|         } | 
|   | 
|         public IDistributedCache Cache => _cache; | 
|   | 
|         public void AddCacheKey(string cacheKey) | 
|         { | 
|             var res = _cache.GetString(CacheConst.KeyAll); | 
|             var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JsonConvert.DeserializeObject<List<string>>(res); | 
|             if (!allkeys.Any(m => m == cacheKey)) | 
|             { | 
|                 allkeys.Add(cacheKey); | 
|                 _cache.SetString(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 增加缓存Key | 
|         /// </summary> | 
|         /// <param name="cacheKey"></param> | 
|         /// <returns></returns> | 
|         public async Task AddCacheKeyAsync(string cacheKey) | 
|         { | 
|             var res = await _cache.GetStringAsync(CacheConst.KeyAll); | 
|             var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JsonConvert.DeserializeObject<List<string>>(res); | 
|             if (!allkeys.Any(m => m == cacheKey)) | 
|             { | 
|                 allkeys.Add(cacheKey); | 
|                 await _cache.SetStringAsync(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); | 
|             } | 
|         } | 
|   | 
|         public void DelByPattern(string key) | 
|         { | 
|             var allkeys = GetAllCacheKeys(); | 
|             if (allkeys == null) return; | 
|   | 
|             var delAllkeys = allkeys.Where(u => u.Contains(key)).ToList(); | 
|             delAllkeys.ForEach(u => { _cache.Remove(u); }); | 
|   | 
|             // 更新所有缓存键 | 
|             allkeys = allkeys.Where(u => !u.Contains(key)).ToList(); | 
|             _cache.SetString(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 删除某特征关键字缓存 | 
|         /// </summary> | 
|         /// <param name="key"></param> | 
|         /// <returns></returns> | 
|         public async Task DelByPatternAsync(string key) | 
|         { | 
|             var allkeys = await GetAllCacheKeysAsync(); | 
|             if (allkeys == null) return; | 
|   | 
|             var delAllkeys = allkeys.Where(u => u.Contains(key)).ToList(); | 
|             delAllkeys.ForEach(u => { _cache.Remove(u); }); | 
|   | 
|             // 更新所有缓存键 | 
|             allkeys = allkeys.Where(u => !u.Contains(key)).ToList(); | 
|             await _cache.SetStringAsync(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); | 
|         } | 
|   | 
|         public void DelCacheKey(string cacheKey) | 
|         { | 
|             var res = _cache.GetString(CacheConst.KeyAll); | 
|             var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JsonConvert.DeserializeObject<List<string>>(res); | 
|             if (allkeys.Any(m => m == cacheKey)) | 
|             { | 
|                 allkeys.Remove(cacheKey); | 
|                 _cache.SetString(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 删除缓存 | 
|         /// </summary> | 
|         /// <param name="cacheKey"></param> | 
|         /// <returns></returns> | 
|         public async Task DelCacheKeyAsync(string cacheKey) | 
|         { | 
|             var res = await _cache.GetStringAsync(CacheConst.KeyAll); | 
|             var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JsonConvert.DeserializeObject<List<string>>(res); | 
|             if (allkeys.Any(m => m == cacheKey)) | 
|             { | 
|                 allkeys.Remove(cacheKey); | 
|                 await _cache.SetStringAsync(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); | 
|             } | 
|         } | 
|   | 
|         public bool Exists(string cacheKey) | 
|         { | 
|             var res = _cache.Get(cacheKey); | 
|             return res != null; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 检查给定 key 是否存在 | 
|         /// </summary> | 
|         /// <param name="cacheKey">键</param> | 
|         /// <returns></returns> | 
|         public async Task<bool> ExistsAsync(string cacheKey) | 
|         { | 
|             var res = await _cache.GetAsync(cacheKey); | 
|             return res != null; | 
|         } | 
|   | 
|         public List<string> GetAllCacheKeys() | 
|         { | 
|             var res = _cache.GetString(CacheConst.KeyAll); | 
|             return string.IsNullOrWhiteSpace(res) ? null : JsonConvert.DeserializeObject<List<string>>(res); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 获取所有缓存列表 | 
|         /// </summary> | 
|         /// <returns></returns> | 
|         public async Task<List<string>> GetAllCacheKeysAsync() | 
|         { | 
|             var res = await _cache.GetStringAsync(CacheConst.KeyAll); | 
|             return string.IsNullOrWhiteSpace(res) ? null : JsonConvert.DeserializeObject<List<string>>(res); | 
|         } | 
|   | 
|         public T Get<T>(string cacheKey) | 
|         { | 
|             var res = _cache.Get(cacheKey); | 
|             return res == null ? default : JsonConvert.DeserializeObject<T>(Encoding.UTF8.GetString(res)); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 获取缓存 | 
|         /// </summary> | 
|         /// <typeparam name="T"></typeparam> | 
|         /// <param name="cacheKey"></param> | 
|         /// <returns></returns> | 
|         public async Task<T> GetAsync<T>(string cacheKey) | 
|         { | 
|             var res = await _cache.GetAsync(cacheKey); | 
|             return res == null ? default : JsonConvert.DeserializeObject<T>(Encoding.UTF8.GetString(res)); | 
|         } | 
|   | 
|         public object Get(Type type, string cacheKey) | 
|         { | 
|             var res = _cache.Get(cacheKey); | 
|             return res == null ? default : JsonConvert.DeserializeObject(Encoding.UTF8.GetString(res), type); | 
|         } | 
|   | 
|         public async Task<object> GetAsync(Type type, string cacheKey) | 
|         { | 
|             var res = await _cache.GetAsync(cacheKey); | 
|             return res == null ? default : JsonConvert.DeserializeObject(Encoding.UTF8.GetString(res), type); | 
|         } | 
|   | 
|         public string GetString(string cacheKey) | 
|         { | 
|             return _cache.GetString(cacheKey); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 获取缓存 | 
|         /// </summary> | 
|         /// <param name="cacheKey"></param> | 
|         /// <returns></returns> | 
|         public async Task<string> GetStringAsync(string cacheKey) | 
|         { | 
|             return await _cache.GetStringAsync(cacheKey); | 
|         } | 
|   | 
|         public void Remove(string key) | 
|         { | 
|             _cache.Remove(key); | 
|             DelCacheKey(key); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 删除缓存 | 
|         /// </summary> | 
|         /// <param name="key"></param> | 
|         /// <returns></returns> | 
|         public async Task RemoveAsync(string key) | 
|         { | 
|             await _cache.RemoveAsync(key); | 
|             await DelCacheKeyAsync(key); | 
|         } | 
|   | 
|         public void RemoveAll() | 
|         { | 
|             var catches = GetAllCacheKeys(); | 
|             foreach (var @catch in catches) Remove(@catch); | 
|   | 
|             catches.Clear(); | 
|             _cache.SetString(CacheConst.KeyAll, JsonConvert.SerializeObject(catches)); | 
|         } | 
|   | 
|         public async Task RemoveAllAsync() | 
|         { | 
|             var catches = await GetAllCacheKeysAsync(); | 
|             foreach (var @catch in catches) await RemoveAsync(@catch); | 
|   | 
|             catches.Clear(); | 
|             await _cache.SetStringAsync(CacheConst.KeyAll, JsonConvert.SerializeObject(catches)); | 
|         } | 
|   | 
|   | 
|         public void Set<T>(string cacheKey, T value, TimeSpan? expire = null) | 
|         { | 
|             _cache.Set(cacheKey, GetBytes(value), | 
|                 expire == null | 
|                     ? new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(6) } | 
|                     : new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = expire }); | 
|   | 
|             AddCacheKey(cacheKey); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 增加对象缓存 | 
|         /// </summary> | 
|         /// <param name="cacheKey"></param> | 
|         /// <param name="value"></param> | 
|         /// <returns></returns> | 
|         public async Task SetAsync<T>(string cacheKey, T value) | 
|         { | 
|             await _cache.SetAsync(cacheKey, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), | 
|                 new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(6) }); | 
|   | 
|             await AddCacheKeyAsync(cacheKey); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 增加对象缓存,并设置过期时间 | 
|         /// </summary> | 
|         /// <param name="cacheKey"></param> | 
|         /// <param name="value"></param> | 
|         /// <param name="expire"></param> | 
|         /// <returns></returns> | 
|         public async Task SetAsync<T>(string cacheKey, T value, TimeSpan expire) | 
|         { | 
|             await _cache.SetAsync(cacheKey, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), | 
|                 new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = expire }); | 
|   | 
|             await AddCacheKeyAsync(cacheKey); | 
|         } | 
|   | 
|         public void SetPermanent<T>(string cacheKey, T value) | 
|         { | 
|             _cache.Set(cacheKey, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value))); | 
|             AddCacheKey(cacheKey); | 
|         } | 
|   | 
|         public async Task SetPermanentAsync<T>(string cacheKey, T value) | 
|         { | 
|             await _cache.SetAsync(cacheKey, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value))); | 
|             await AddCacheKeyAsync(cacheKey); | 
|         } | 
|   | 
|         public void SetString(string cacheKey, string value, TimeSpan? expire = null) | 
|         { | 
|             if (expire == null) | 
|                 _cache.SetString(cacheKey, value, new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(6) }); | 
|             else | 
|                 _cache.SetString(cacheKey, value, new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = expire }); | 
|   | 
|             AddCacheKey(cacheKey); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 增加字符串缓存 | 
|         /// </summary> | 
|         /// <param name="cacheKey"></param> | 
|         /// <param name="value"></param> | 
|         /// <returns></returns> | 
|         public async Task SetStringAsync(string cacheKey, string value) | 
|         { | 
|             await _cache.SetStringAsync(cacheKey, value, new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(6) }); | 
|   | 
|             await AddCacheKeyAsync(cacheKey); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 增加字符串缓存,并设置过期时间 | 
|         /// </summary> | 
|         /// <param name="cacheKey"></param> | 
|         /// <param name="value"></param> | 
|         /// <param name="expire"></param> | 
|         /// <returns></returns> | 
|         public async Task SetStringAsync(string cacheKey, string value, TimeSpan expire) | 
|         { | 
|             await _cache.SetStringAsync(cacheKey, value, new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = expire }); | 
|   | 
|             await AddCacheKeyAsync(cacheKey); | 
|         } | 
|   | 
|   | 
|         /// <summary> | 
|         /// 缓存最大角色数据范围 | 
|         /// </summary> | 
|         /// <param name="userId"></param> | 
|         /// <param name="dataScopeType"></param> | 
|         /// <returns></returns> | 
|         public async Task SetMaxDataScopeType(long userId, int dataScopeType) | 
|         { | 
|             var cacheKey = CacheConst.KeyMaxDataScopeType + userId; | 
|             await SetStringAsync(cacheKey, dataScopeType.ToString()); | 
|   | 
|             await AddCacheKeyAsync(cacheKey); | 
|         } | 
|   | 
|         /// <summary> | 
|         ///  根据父键清空 | 
|         /// </summary> | 
|         /// <param name="key"></param> | 
|         /// <returns></returns> | 
|         public async Task DelByParentKeyAsync(string key) | 
|         { | 
|             var allkeys = await GetAllCacheKeysAsync(); | 
|             if (allkeys == null) return; | 
|   | 
|             var delAllkeys = allkeys.Where(u => u.StartsWith(key)).ToList(); | 
|             delAllkeys.ForEach(Remove); | 
|             // 更新所有缓存键 | 
|             allkeys = allkeys.Where(u => !u.StartsWith(key)).ToList(); | 
|             await SetStringAsync(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); | 
|         } | 
|     } | 
| } |