// Admin.NET 项目的版æƒã€å•†æ ‡ã€ä¸“利和其他相关æƒåˆ©å‡å—ç›¸åº”æ³•å¾‹æ³•è§„çš„ä¿æŠ¤ã€‚ä½¿ç”¨æœ¬é¡¹ç›®åº”éµå®ˆç›¸å…³æ³•律法规和许å¯è¯çš„è¦æ±‚。 // // 本项目主è¦éµå¾ª MIT 许å¯è¯å’Œ Apache 许å¯è¯ï¼ˆç‰ˆæœ¬ 2.0)进行分å‘和使用。许å¯è¯ä½äºŽæºä»£ç æ ‘æ ¹ç›®å½•ä¸çš„ LICENSE-MIT å’Œ LICENSE-APACHE 文件。 // // ä¸å¾—利用本项目从事å±å®³å›½å®¶å®‰å…¨ã€æ‰°ä¹±ç¤¾ä¼šç§©åºã€ä¾µçŠ¯ä»–äººåˆæ³•æƒç›Šç‰æ³•å¾‹æ³•è§„ç¦æ¢çš„æ´»åЍï¼ä»»ä½•基于本项目二次开å‘è€Œäº§ç”Ÿçš„ä¸€åˆ‡æ³•å¾‹çº çº·å’Œè´£ä»»ï¼Œæˆ‘ä»¬ä¸æ‰¿æ‹…ä»»ä½•è´£ä»»ï¼ using NewLife.Caching.Models; namespace Admin.NET.Core.Service; /// <summary> /// ç³»ç»Ÿç¼“å˜æœåŠ¡ 🧩 /// </summary> [ApiDescriptionSettings(Order = 400)] public class SysCacheService : IDynamicApiController, ISingleton { private static ICacheProvider _cacheProvider; private readonly CacheOptions _cacheOptions; public SysCacheService(ICacheProvider cacheProvider, IOptions<CacheOptions> cacheOptions) { _cacheProvider = cacheProvider; _cacheOptions = cacheOptions.Value; } /// <summary> /// 获å–缓å˜é”®åé›†åˆ ðŸ”– /// </summary> /// <returns></returns> [DisplayName("获å–缓å˜é”®å集åˆ")] public List<string> GetKeyList() { return _cacheProvider.Cache == Cache.Default ? _cacheProvider.Cache.Keys.Where(u => u.StartsWith(_cacheOptions.Prefix)).Select(u => u[_cacheOptions.Prefix.Length..]).OrderBy(u => u).ToList() : ((FullRedis)_cacheProvider.Cache).Search($"{_cacheOptions.Prefix}*", int.MaxValue).Select(u => u[_cacheOptions.Prefix.Length..]).OrderBy(u => u).ToList(); } /// <summary> /// å¢žåŠ ç¼“å˜ /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <returns></returns> [NonAction] public bool Set(string key, object value) { if (string.IsNullOrWhiteSpace(key)) return false; return _cacheProvider.Cache.Set($"{_cacheOptions.Prefix}{key}", value); } /// <summary> /// å¢žåŠ ç¼“å˜å¹¶è®¾ç½®è¿‡æœŸæ—¶é—´ /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <param name="expire"></param> /// <returns></returns> [NonAction] public bool Set(string key, object value, TimeSpan expire) { if (string.IsNullOrWhiteSpace(key)) return false; return _cacheProvider.Cache.Set($"{_cacheOptions.Prefix}{key}", value, expire); } /// <summary> /// 获å–ç¼“å˜ /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> [NonAction] public T Get<T>(string key) { return _cacheProvider.Cache.Get<T>($"{_cacheOptions.Prefix}{key}"); } /// <summary> /// åˆ é™¤ç¼“å˜ ðŸ”– /// </summary> /// <param name="key"></param> /// <returns></returns> [ApiDescriptionSettings(Name = "Delete"), HttpPost] [DisplayName("åˆ é™¤ç¼“å˜")] public int Remove(string key) { return _cacheProvider.Cache.Remove($"{_cacheOptions.Prefix}{key}"); } /// <summary> /// æ¸…ç©ºæ‰€æœ‰ç¼“å˜ ðŸ”– /// </summary> /// <returns></returns> [DisplayName("清空所有缓å˜")] [ApiDescriptionSettings(Name = "Clear"), HttpPost] public void Clear() { _cacheProvider.Cache.Clear(); Cache.Default.Clear(); } /// <summary> /// æ£€æŸ¥ç¼“å˜æ˜¯å¦å˜åœ¨ /// </summary> /// <param name="key">é”®</param> /// <returns></returns> [NonAction] public bool ExistKey(string key) { return _cacheProvider.Cache.ContainsKey($"{_cacheOptions.Prefix}{key}"); } /// <summary> /// æ ¹æ®é”®åå‰ç¼€åˆ é™¤ç¼“å˜ ðŸ”– /// </summary> /// <param name="prefixKey">é”®åå‰ç¼€</param> /// <returns></returns> [ApiDescriptionSettings(Name = "DeleteByPreKey"), HttpPost] [DisplayName("æ ¹æ®é”®åå‰ç¼€åˆ 除缓å˜")] public int RemoveByPrefixKey(string prefixKey) { var delKeys = _cacheProvider.Cache == Cache.Default ? _cacheProvider.Cache.Keys.Where(u => u.StartsWith($"{_cacheOptions.Prefix}{prefixKey}")).ToArray() : ((FullRedis)_cacheProvider.Cache).Search($"{_cacheOptions.Prefix}{prefixKey}*", int.MaxValue).ToArray(); return _cacheProvider.Cache.Remove(delKeys); } /// <summary> /// æ ¹æ®é”®åå‰ç¼€èŽ·å–é”®åé›†åˆ ðŸ”– /// </summary> /// <param name="prefixKey">é”®åå‰ç¼€</param> /// <returns></returns> [DisplayName("æ ¹æ®é”®åå‰ç¼€èŽ·å–é”®å集åˆ")] public List<string> GetKeysByPrefixKey(string prefixKey) { return _cacheProvider.Cache == Cache.Default ? _cacheProvider.Cache.Keys.Where(u => u.StartsWith($"{_cacheOptions.Prefix}{prefixKey}")).Select(u => u[_cacheOptions.Prefix.Length..]).ToList() : ((FullRedis)_cacheProvider.Cache).Search($"{_cacheOptions.Prefix}{prefixKey}*", int.MaxValue).Select(u => u[_cacheOptions.Prefix.Length..]).ToList(); } /// <summary> /// 获å–缓å˜å€¼ 🔖 /// </summary> /// <param name="key"></param> /// <returns></returns> [DisplayName("获å–缓å˜å€¼")] public object GetValue(string key) { // è‹¥Keyç»è¿‡URLç¼–ç 则进行解ç if (Regex.IsMatch(key, @"%[0-9a-fA-F]{2}")) key = HttpUtility.UrlDecode(key); return _cacheProvider.Cache == Cache.Default ? _cacheProvider.Cache.Get<object>($"{_cacheOptions.Prefix}{key}") : _cacheProvider.Cache.Get<string>($"{_cacheOptions.Prefix}{key}"); } /// <summary> /// èŽ·å–æˆ–æ·»åŠ ç¼“å˜ï¼ˆåœ¨æ•°æ®ä¸å˜åœ¨æ—¶æ‰§è¡Œå§”托请求数æ®ï¼‰ /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="callback"></param> /// <param name="expire">过期时间,å•ä½ç§’</param> /// <returns></returns> [NonAction] public T GetOrAdd<T>(string key, Func<string, T> callback, int expire = -1) { if (string.IsNullOrWhiteSpace(key)) return default; return _cacheProvider.Cache.GetOrAdd($"{_cacheOptions.Prefix}{key}", callback, expire); } /// <summary> /// HashåŒ¹é… /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> [NonAction] public RedisHash<string, T> GetHashMap<T>(string key) { return _cacheProvider.Cache.GetDictionary<T>(key) as RedisHash<string, T>; } /// <summary> /// æ‰¹é‡æ·»åŠ HASH /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="dic"></param> /// <returns></returns> [NonAction] public bool HashSet<T>(string key, Dictionary<string, T> dic) { var hash = GetHashMap<T>(key); return hash.HMSet(dic); } /// <summary> /// æ·»åŠ ä¸€æ¡HASH /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="hashKey"></param> /// <param name="value"></param> [NonAction] public void HashAdd<T>(string key, string hashKey, T value) { var hash = GetHashMap<T>(key); hash.Add(hashKey, value); } /// <summary> /// 获å–多æ¡HASH /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="fields"></param> /// <returns></returns> [NonAction] public List<T> HashGet<T>(string key, params string[] fields) { var hash = GetHashMap<T>(key); var result = hash.HMGet(fields); return result.ToList(); } /// <summary> /// 获å–一æ¡HASH /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="field"></param> /// <returns></returns> [NonAction] public T HashGetOne<T>(string key, string field) { var hash = GetHashMap<T>(key); var result = hash.HMGet(new string[] { field }); return result[0]; } /// <summary> /// æ ¹æ®KEYèŽ·å–æ‰€æœ‰HASH /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> [NonAction] public IDictionary<string, T> HashGetAll<T>(string key) { var hash = GetHashMap<T>(key); return hash.GetAll(); } /// <summary> /// åˆ é™¤HASH /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="fields"></param> /// <returns></returns> [NonAction] public int HashDel<T>(string key, params string[] fields) { var hash = GetHashMap<T>(key); return hash.HDel(fields); } /// <summary> /// æœç´¢HASH /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="searchModel"></param> /// <returns></returns> [NonAction] public List<KeyValuePair<string, T>> HashSearch<T>(string key, SearchModel searchModel) { var hash = GetHashMap<T>(key); return hash.Search(searchModel).ToList(); } /// <summary> /// æœç´¢HASH /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="pattern"></param> /// <param name="count"></param> /// <returns></returns> [NonAction] public List<KeyValuePair<string, T>> HashSearch<T>(string key, string pattern, int count) { var hash = GetHashMap<T>(key); return hash.Search(pattern, count).ToList(); } }