SysCacheService.cs 8.0 KB

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