SysCacheService.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. using Furion.DependencyInjection;
  2. using Furion.DynamicApiController;
  3. using Furion.JsonSerialization;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.Extensions.Caching.Distributed;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace Admin.NET.Core.Service
  11. {
  12. /// <summary>
  13. /// 系统缓存服务
  14. /// </summary>
  15. [ApiDescriptionSettings(Name = "系统缓存", Order = 190)]
  16. public class SysCacheService : ISysCacheService, IDynamicApiController, ISingleton
  17. {
  18. private readonly IDistributedCache _cache;
  19. public SysCacheService(IDistributedCache cache)
  20. {
  21. _cache = cache;
  22. }
  23. /// <summary>
  24. /// 获取所有缓存列表
  25. /// </summary>
  26. /// <returns></returns>
  27. [HttpGet("/sysCache/keyList")]
  28. public async Task<List<string>> GetAllCacheKeys()
  29. {
  30. var res = await _cache.GetStringAsync(CacheConst.KeyAll);
  31. return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize<List<string>>(res);
  32. }
  33. /// <summary>
  34. /// 增加对象缓存
  35. /// </summary>
  36. /// <param name="cacheKey"></param>
  37. /// <param name="value"></param>
  38. /// <returns></returns>
  39. [HttpPost("/sysCache/addObject")]
  40. public async Task SetAsync(string cacheKey, object value)
  41. {
  42. await _cache.SetAsync(cacheKey, Encoding.UTF8.GetBytes(JSON.Serialize(value)));
  43. await AddCacheKey(cacheKey);
  44. }
  45. /// <summary>
  46. /// 增加字符串缓存
  47. /// </summary>
  48. /// <param name="cacheKey"></param>
  49. /// <param name="value"></param>
  50. /// <returns></returns>
  51. [HttpPost("/sysCache/addString")]
  52. public async Task SetStringAsync(string cacheKey, string value)
  53. {
  54. await _cache.SetStringAsync(cacheKey, value);
  55. await AddCacheKey(cacheKey);
  56. }
  57. /// <summary>
  58. /// 获取缓存
  59. /// </summary>
  60. /// <param name="cacheKey"></param>
  61. /// <returns></returns>
  62. [HttpGet("/sysCache/detail")]
  63. public async Task<string> GetStringAsync(string cacheKey)
  64. {
  65. return await _cache.GetStringAsync(cacheKey);
  66. }
  67. /// <summary>
  68. /// 删除缓存
  69. /// </summary>
  70. /// <param name="key"></param>
  71. /// <returns></returns>
  72. [HttpGet("/sysCache/remove")]
  73. public async Task RemoveAsync(string key)
  74. {
  75. await _cache.RemoveAsync(key);
  76. await DelCacheKey(key);
  77. }
  78. /// <summary>
  79. /// 删除某特征关键字缓存
  80. /// </summary>
  81. /// <param name="key"></param>
  82. /// <returns></returns>
  83. [NonAction]
  84. public async Task DelByPatternAsync(string key)
  85. {
  86. var allkeys = await GetAllCacheKeys();
  87. if (allkeys == null) return;
  88. var delAllkeys = allkeys.Where(u => u.Contains(key)).ToList();
  89. delAllkeys.ForEach(u =>
  90. {
  91. _cache.Remove(u);
  92. });
  93. // 更新所有缓存键
  94. allkeys = allkeys.Where(u => !u.Contains(key)).ToList();
  95. await _cache.SetStringAsync(CacheConst.KeyAll, JSON.Serialize(allkeys));
  96. }
  97. /// <summary>
  98. /// 获取缓存
  99. /// </summary>
  100. /// <typeparam name="T"></typeparam>
  101. /// <param name="cacheKey"></param>
  102. /// <returns></returns>
  103. [NonAction]
  104. public async Task<T> GetAsync<T>(string cacheKey)
  105. {
  106. var res = await _cache.GetAsync(cacheKey);
  107. return res == null ? default : JSON.Deserialize<T>(Encoding.UTF8.GetString(res));
  108. }
  109. /// <summary>
  110. /// 检查给定 key 是否存在
  111. /// </summary>
  112. /// <param name="cacheKey">键</param>
  113. /// <returns></returns>
  114. [NonAction]
  115. public bool Exists(string cacheKey)
  116. {
  117. return _cache.Equals(cacheKey);
  118. }
  119. /// <summary>
  120. /// 增加缓存Key
  121. /// </summary>
  122. /// <param name="cacheKey"></param>
  123. /// <returns></returns>
  124. [NonAction]
  125. public async Task AddCacheKey(string cacheKey)
  126. {
  127. var res = await _cache.GetStringAsync(CacheConst.KeyAll);
  128. var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JSON.Deserialize<List<string>>(res);
  129. if (!allkeys.Any(m => m == cacheKey))
  130. {
  131. allkeys.Add(cacheKey);
  132. await _cache.SetStringAsync(CacheConst.KeyAll, JSON.Serialize(allkeys));
  133. }
  134. }
  135. /// <summary>
  136. /// 删除缓存
  137. /// </summary>
  138. /// <param name="cacheKey"></param>
  139. /// <returns></returns>
  140. [NonAction]
  141. public async Task DelCacheKey(string cacheKey)
  142. {
  143. var res = await _cache.GetStringAsync(CacheConst.KeyAll);
  144. var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JSON.Deserialize<List<string>>(res);
  145. if (allkeys.Any(m => m == cacheKey))
  146. {
  147. allkeys.Remove(cacheKey);
  148. await _cache.SetStringAsync(CacheConst.KeyAll, JSON.Serialize(allkeys));
  149. }
  150. }
  151. /// <summary>
  152. /// 获取机构Id集合
  153. /// </summary>
  154. /// <param name="userId"></param>
  155. /// <returns></returns>
  156. [NonAction]
  157. public async Task<List<long>> GetOrgIdList(long userId)
  158. {
  159. var cacheKey = CacheConst.KeyOrgIdList + userId;
  160. var res = await _cache.GetStringAsync(cacheKey);
  161. return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize<List<long>>(res);
  162. }
  163. /// <summary>
  164. /// 缓存机构Id集合
  165. /// </summary>
  166. /// <param name="userId"></param>
  167. /// <param name="orgIdList"></param>
  168. /// <returns></returns>
  169. [NonAction]
  170. public async Task SetOrgIdList(long userId, List<long> orgIdList)
  171. {
  172. var cacheKey = CacheConst.KeyOrgIdList + userId;
  173. await _cache.SetStringAsync(cacheKey, JSON.Serialize(orgIdList));
  174. await AddCacheKey(cacheKey);
  175. }
  176. ///// <summary>
  177. ///// 获取菜单缓存
  178. ///// </summary>
  179. ///// <param name="userId"></param>
  180. ///// <param name="appCode"></param>
  181. ///// <returns></returns>
  182. //[NonAction]
  183. //public async Task<List<AntDesignTreeNode>> GetMenu(long userId, string appCode)
  184. //{
  185. // var cacheKey = CacheConst.KeyMenu + $"{userId}-{appCode}";
  186. // var res = await _cache.GetStringAsync(cacheKey);
  187. // return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize<List<AntDesignTreeNode>>(res);
  188. //}
  189. ///// <summary>
  190. ///// 缓存菜单
  191. ///// </summary>
  192. ///// <param name="userId"></param>
  193. ///// <param name="appCode"></param>
  194. ///// <param name="menus"></param>
  195. ///// <returns></returns>
  196. //[NonAction]
  197. //public async Task SetMenu(long userId, string appCode, List<AntDesignTreeNode> menus)
  198. //{
  199. // var cacheKey = CommonConst.CACHE_KEY_MENU + $"{userId}-{appCode}";
  200. // await _cache.SetStringAsync(cacheKey, JSON.Serialize(menus));
  201. // await AddCacheKey(cacheKey);
  202. //}
  203. /// <summary>
  204. /// 获取权限缓存(按钮)
  205. /// </summary>
  206. /// <param name="userId"></param>
  207. /// <returns></returns>
  208. [NonAction]
  209. public async Task<List<string>> GetPermission(long userId)
  210. {
  211. var cacheKey = CacheConst.KeyPermission + userId;
  212. var res = await _cache.GetStringAsync(cacheKey);
  213. return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize<List<string>>(res);
  214. }
  215. /// <summary>
  216. /// 缓存权限
  217. /// </summary>
  218. /// <param name="userId"></param>
  219. /// <param name="permissions"></param>
  220. /// <returns></returns>
  221. [NonAction]
  222. public async Task SetPermission(long userId, List<string> permissions)
  223. {
  224. var cacheKey = CacheConst.KeyPermission + userId;
  225. await _cache.SetStringAsync(cacheKey, JSON.Serialize(permissions));
  226. await AddCacheKey(cacheKey);
  227. }
  228. }
  229. }