128 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using System.Reflection;
 | |
| using System.Text.RegularExpressions;
 | |
| using System.Threading.Tasks;
 | |
| using Microsoft.Extensions.Caching.Memory;
 | |
| 
 | |
| namespace IRaCIS.Core.Infra.Common.Cache
 | |
| {
 | |
|     /// <summary>
 | |
|     /// 内存缓存
 | |
|     /// </summary>
 | |
|     public class MemoryCache : ICache
 | |
|     {
 | |
|         private readonly IMemoryCache _memoryCache;
 | |
|         public MemoryCache(IMemoryCache memoryCache)
 | |
|         {
 | |
|             _memoryCache = memoryCache;
 | |
|         }
 | |
| 
 | |
|         public long Del(params string[] key)
 | |
|         {
 | |
|             foreach(var k in key)
 | |
|             {
 | |
|                 _memoryCache.Remove(k);
 | |
|             }
 | |
|             return key.Length;
 | |
|         }
 | |
| 
 | |
|         public Task<long> DelAsync(params string[] key)
 | |
|         {
 | |
|             foreach (var k in key)
 | |
|             {
 | |
|                 _memoryCache.Remove(k);
 | |
|             }
 | |
| 
 | |
|             return Task.FromResult((long)key.Length);
 | |
|         }
 | |
| 
 | |
|         public async Task<long> DelByPatternAsync(string pattern)
 | |
|         {
 | |
|             if (string.IsNullOrEmpty(pattern))
 | |
|                 return default;
 | |
| 
 | |
|             pattern = Regex.Replace(pattern, @"\{.*\}", "(.*)");
 | |
| 
 | |
|             var keys = GetAllKeys().Where(k => Regex.IsMatch(k, pattern));
 | |
|             
 | |
|             if(keys != null && keys.Count() > 0)
 | |
|             {
 | |
|                 return await DelAsync(keys.ToArray());
 | |
|             }
 | |
| 
 | |
|             return default;
 | |
|         }
 | |
| 
 | |
|         public bool Exists(string key)
 | |
|         {
 | |
|             return _memoryCache.TryGetValue(key, out _);
 | |
|         }
 | |
| 
 | |
|         public Task<bool> ExistsAsync(string key)
 | |
|         {
 | |
|             return Task.FromResult(_memoryCache.TryGetValue(key, out _));
 | |
|         }
 | |
| 
 | |
|         public string Get(string key)
 | |
|         {
 | |
|             return _memoryCache.Get(key)?.ToString();
 | |
|         }
 | |
| 
 | |
|         public T Get<T>(string key)
 | |
|         {
 | |
|             return _memoryCache.Get<T>(key);
 | |
|         }
 | |
| 
 | |
|         public Task<string> GetAsync(string key)
 | |
|         {
 | |
|             return Task.FromResult(Get(key));
 | |
|         }
 | |
| 
 | |
|         public Task<T> GetAsync<T>(string key)
 | |
|         {
 | |
|             return Task.FromResult(Get<T>(key));
 | |
|         }
 | |
| 
 | |
|         public bool Set(string key, object value)
 | |
|         {
 | |
|             _memoryCache.Set(key, value);
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         public bool Set(string key, object value, TimeSpan expire)
 | |
|         {
 | |
|             _memoryCache.Set(key, value, expire);
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         public Task<bool> SetAsync(string key, object value)
 | |
|         {
 | |
|             Set(key, value);
 | |
|             return Task.FromResult(true);
 | |
|         }
 | |
| 
 | |
|         public Task<bool> SetAsync(string key, object value, TimeSpan expire)
 | |
|         {
 | |
|             Set(key, value, expire);
 | |
|             return Task.FromResult(true);
 | |
|         }
 | |
| 
 | |
|         private List<string> GetAllKeys()
 | |
|         {
 | |
|             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<string>();
 | |
|             if (cacheItems == null) return keys;
 | |
|             foreach (DictionaryEntry cacheItem in cacheItems)
 | |
|             {
 | |
|                 keys.Add(cacheItem.Key.ToString());
 | |
|             }
 | |
|             return keys;
 | |
|         }
 | |
|     }
 | |
| }
 |