From 7281004dc3854ed59e9164dcd27a59c8c2cf6667 Mon Sep 17 00:00:00 2001
From: qinchulong <qinchulong@hnkhzn.com>
Date: 星期六, 12 十月 2024 15:16:55 +0800
Subject: [PATCH] 初始化

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_Core/Caches/Caching.cs |  351 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 351 insertions(+), 0 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/Caches/Caching.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/Caches/Caching.cs"
new file mode 100644
index 0000000..fff2699
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/Caches/Caching.cs"
@@ -0,0 +1,351 @@
+锘縰sing 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>
+    /// 瀹炰緥鍖栫紦瀛樻帴鍙Caching
+    /// </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));
+        }
+    }
+}

--
Gitblit v1.9.3