0
0
Просмотр исходного кода

缓存接口新增获取或设置缓存方法

zhontai 3 лет назад
Родитель
Сommit
118f64f710

+ 12 - 2
Admin.Core.Common/Cache/ICache.cs

@@ -53,7 +53,7 @@ namespace Admin.Core.Common.Cache
         /// <summary>
         /// 获取指定 key 的值
         /// </summary>
-        /// <typeparam name="T">byte[] 或其他类型</typeparam>
+        /// <typeparam name="T">数据类型</typeparam>
         /// <param name="key">键</param>
         /// <returns></returns>
         T Get<T>(string key);
@@ -68,7 +68,7 @@ namespace Admin.Core.Common.Cache
         /// <summary>
         /// 获取指定 key 的值
         /// </summary>
-        /// <typeparam name="T">byte[] 或其他类型</typeparam>
+        /// <typeparam name="T">数据类型</typeparam>
         /// <param name="key">键</param>
         /// <returns></returns>
         Task<T> GetAsync<T>(string key);
@@ -104,5 +104,15 @@ namespace Admin.Core.Common.Cache
         /// <param name="expire">有效期</param>
         /// <returns></returns>
         Task<bool> SetAsync(string key, object value, TimeSpan expire);
+
+        /// <summary>
+        /// 获取或设置缓存
+        /// </summary>
+        /// <typeparam name="T">数据类型</typeparam>
+        /// <param name="key">键</param>
+        /// <param name="func">获取数据的方法</param>
+        /// <param name="expire">有效期</param>
+        /// <returns></returns>
+        Task<T> GetOrSetAsync<T>(string key, Func<Task<T>> func, TimeSpan? expire = null);
     }
 }

+ 28 - 0
Admin.Core.Common/Cache/MemoryCache.cs

@@ -112,6 +112,34 @@ namespace Admin.Core.Common.Cache
             return Task.FromResult(true);
         }
 
+        public async Task<T> GetOrSetAsync<T>(string key, Func<Task<T>> func, TimeSpan? expire = null)
+        {
+            if (await ExistsAsync(key))
+            {
+                try
+                {
+                    return await GetAsync<T>(key);
+                }
+                catch
+                {
+                    await DelAsync(key);
+                }
+            }
+
+            var result = await func.Invoke();
+
+            if (expire.HasValue)
+            {
+                await SetAsync(key, result, expire.Value);
+            }
+            else
+            {
+                await SetAsync(key, result);
+            }
+
+            return result;
+        }
+
         private List<string> GetAllKeys()
         {
             const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;

+ 28 - 0
Admin.Core.Common/Cache/RedisCache.cs

@@ -85,5 +85,33 @@ namespace Admin.Core.Common.Cache
         {
             return RedisHelper.SetAsync(key, value, expire);
         }
+
+        public async Task<T> GetOrSetAsync<T>(string key, Func<Task<T>> func, TimeSpan? expire = null)
+        {
+            if (await RedisHelper.ExistsAsync(key))
+            {
+                try
+                {
+                    return await RedisHelper.GetAsync<T>(key);
+                }
+                catch
+                {
+                    await RedisHelper.DelAsync(key);
+                }
+            }
+
+            var result = await func.Invoke();
+
+            if(expire.HasValue)
+            {
+                await RedisHelper.SetAsync(key, result, expire.Value);
+            }
+            else
+            {
+                await RedisHelper.SetAsync(key, result);
+            }
+
+            return result;
+        }
     }
 }

+ 5 - 16
Admin.Core.Services/Admin/User/UserService.cs

@@ -71,27 +71,16 @@ namespace Admin.Core.Service.Admin.User
         public async Task<IList<UserPermissionsOutput>> GetPermissionsAsync()
         {
             var key = string.Format(CacheKey.UserPermissions, User.Id);
-            if (await _cache.ExistsAsync(key))
+            var result = await _cache.GetOrSetAsync<IList<UserPermissionsOutput>>(key, async () =>
             {
-                try
-                {
-                    return await _cache.GetAsync<IList<UserPermissionsOutput>>(key);
-                }
-                catch
-                {
-                    await _cache.DelByPatternAsync("admin:user:{0}:permissions");
-                }
-            }
-
-            var userPermissoins = await _rolePermissionRepository.Select
+                var userPermissoins = await _rolePermissionRepository.Select
                 .InnerJoin<UserRoleEntity>((a, b) => a.RoleId == b.RoleId && b.UserId == User.Id && a.Permission.Type == PermissionType.Api)
                 .Include(a => a.Permission.Api)
                 .Distinct()
                 .ToListAsync(a => new UserPermissionsOutput { HttpMethods = a.Permission.Api.HttpMethods, Path = a.Permission.Api.Path });
-
-            await _cache.SetAsync(key, userPermissoins);
-
-            return userPermissoins;
+                return userPermissoins;
+            });
+            return result;
         }
 
         public async Task<IResponseOutput> PageAsync(PageInput<UserEntity> input)

+ 12 - 2
Admin.Core/Admin.Core.Common.xml

@@ -369,7 +369,7 @@
             <summary>
             获取指定 key 的值
             </summary>
-            <typeparam name="T">byte[] 或其他类型</typeparam>
+            <typeparam name="T">数据类型</typeparam>
             <param name="key">键</param>
             <returns></returns>
         </member>
@@ -384,7 +384,7 @@
             <summary>
             获取指定 key 的值
             </summary>
-            <typeparam name="T">byte[] 或其他类型</typeparam>
+            <typeparam name="T">数据类型</typeparam>
             <param name="key">键</param>
             <returns></returns>
         </member>
@@ -420,6 +420,16 @@
             <param name="expire">有效期</param>
             <returns></returns>
         </member>
+        <member name="M:Admin.Core.Common.Cache.ICache.GetOrSetAsync``1(System.String,System.Func{System.Threading.Tasks.Task{``0}},System.Nullable{System.TimeSpan})">
+            <summary>
+            获取或设置缓存
+            </summary>
+            <typeparam name="T">数据类型</typeparam>
+            <param name="key">键</param>
+            <param name="func">获取数据的方法</param>
+            <param name="expire">有效期</param>
+            <returns></returns>
+        </member>
         <member name="T:Admin.Core.Common.Cache.MemoryCache">
             <summary>
             内存缓存