SysCacheService.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  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. /// <param name="expire"></param>
  41. /// <returns></returns>
  42. [HttpPost("/sysCache/addObject/expire")]
  43. public async Task SetAsync(string cacheKey, object value, TimeSpan expire)
  44. {
  45. await _cache.SetAsync(cacheKey, Encoding.UTF8.GetBytes(JSON.Serialize(value)), new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = expire });
  46. await AddCacheKey(cacheKey);
  47. }
  48. /// <summary>
  49. /// 增加字符串缓存
  50. /// </summary>
  51. /// <param name="cacheKey"></param>
  52. /// <param name="value"></param>
  53. /// <returns></returns>
  54. [HttpPost("/sysCache/addString")]
  55. public async Task SetStringAsync(string cacheKey, string value)
  56. {
  57. await _cache.SetStringAsync(cacheKey, value);
  58. await AddCacheKey(cacheKey);
  59. }
  60. /// <summary>
  61. /// 增加字符串缓存,并设置过期时间
  62. /// </summary>
  63. /// <param name="cacheKey"></param>
  64. /// <param name="value"></param>
  65. /// <param name="expire"></param>
  66. /// <returns></returns>
  67. [HttpPost("/sysCache/addString/expire")]
  68. public async Task SetStringAsync(string cacheKey, string value, TimeSpan expire)
  69. {
  70. await _cache.SetStringAsync(cacheKey, value, new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = expire });
  71. await AddCacheKey(cacheKey);
  72. }
  73. /// <summary>
  74. /// 获取缓存
  75. /// </summary>
  76. /// <param name="cacheKey"></param>
  77. /// <returns></returns>
  78. [HttpGet("/sysCache/detail")]
  79. public async Task<string> GetStringAsync(string cacheKey)
  80. {
  81. return await _cache.GetStringAsync(cacheKey);
  82. }
  83. /// <summary>
  84. /// 删除缓存
  85. /// </summary>
  86. /// <param name="key"></param>
  87. /// <returns></returns>
  88. [HttpGet("/sysCache/remove")]
  89. public async Task RemoveAsync(string key)
  90. {
  91. await _cache.RemoveAsync(key);
  92. await DelCacheKey(key);
  93. }
  94. /// <summary>
  95. /// 删除某特征关键字缓存
  96. /// </summary>
  97. /// <param name="key"></param>
  98. /// <returns></returns>
  99. [NonAction]
  100. public async Task DelByPatternAsync(string key)
  101. {
  102. var allkeys = await GetAllCacheKeys();
  103. if (allkeys == null) return;
  104. var delAllkeys = allkeys.Where(u => u.Contains(key)).ToList();
  105. delAllkeys.ForEach(u =>
  106. {
  107. _cache.Remove(u);
  108. });
  109. // 更新所有缓存键
  110. allkeys = allkeys.Where(u => !u.Contains(key)).ToList();
  111. await _cache.SetStringAsync(CacheConst.KeyAll, JSON.Serialize(allkeys));
  112. }
  113. /// <summary>
  114. /// 获取缓存
  115. /// </summary>
  116. /// <typeparam name="T"></typeparam>
  117. /// <param name="cacheKey"></param>
  118. /// <returns></returns>
  119. [NonAction]
  120. public async Task<T> GetAsync<T>(string cacheKey)
  121. {
  122. var res = await _cache.GetAsync(cacheKey);
  123. return res == null ? default : JSON.Deserialize<T>(Encoding.UTF8.GetString(res));
  124. }
  125. /// <summary>
  126. /// 检查给定 key 是否存在
  127. /// </summary>
  128. /// <param name="cacheKey">键</param>
  129. /// <returns></returns>
  130. [NonAction]
  131. public async Task<bool> ExistsAsync(string cacheKey)
  132. {
  133. var res = await _cache.GetAsync(cacheKey);
  134. return res != null;
  135. }
  136. /// <summary>
  137. /// 增加缓存Key
  138. /// </summary>
  139. /// <param name="cacheKey"></param>
  140. /// <returns></returns>
  141. [NonAction]
  142. public async Task AddCacheKey(string cacheKey)
  143. {
  144. var res = await _cache.GetStringAsync(CacheConst.KeyAll);
  145. var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JSON.Deserialize<List<string>>(res);
  146. if (!allkeys.Any(m => m == cacheKey))
  147. {
  148. allkeys.Add(cacheKey);
  149. await _cache.SetStringAsync(CacheConst.KeyAll, JSON.Serialize(allkeys));
  150. }
  151. }
  152. /// <summary>
  153. /// 删除缓存
  154. /// </summary>
  155. /// <param name="cacheKey"></param>
  156. /// <returns></returns>
  157. [NonAction]
  158. public async Task DelCacheKey(string cacheKey)
  159. {
  160. var res = await _cache.GetStringAsync(CacheConst.KeyAll);
  161. var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JSON.Deserialize<List<string>>(res);
  162. if (allkeys.Any(m => m == cacheKey))
  163. {
  164. allkeys.Remove(cacheKey);
  165. await _cache.SetStringAsync(CacheConst.KeyAll, JSON.Serialize(allkeys));
  166. }
  167. }
  168. /// <summary>
  169. /// 获取机构Id集合
  170. /// </summary>
  171. /// <param name="userId"></param>
  172. /// <returns></returns>
  173. [NonAction]
  174. public async Task<List<long>> GetOrgIdList(long userId)
  175. {
  176. var cacheKey = CacheConst.KeyOrgIdList + userId;
  177. var res = await _cache.GetStringAsync(cacheKey);
  178. return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize<List<long>>(res);
  179. }
  180. /// <summary>
  181. /// 缓存机构Id集合
  182. /// </summary>
  183. /// <param name="userId"></param>
  184. /// <param name="orgIdList"></param>
  185. /// <returns></returns>
  186. [NonAction]
  187. public async Task SetOrgIdList(long userId, List<long> orgIdList)
  188. {
  189. var cacheKey = CacheConst.KeyOrgIdList + userId;
  190. await _cache.SetStringAsync(cacheKey, JSON.Serialize(orgIdList));
  191. await AddCacheKey(cacheKey);
  192. }
  193. ///// <summary>
  194. ///// 获取菜单缓存
  195. ///// </summary>
  196. ///// <param name="userId"></param>
  197. ///// <param name="appCode"></param>
  198. ///// <returns></returns>
  199. //[NonAction]
  200. //public async Task<List<AntDesignTreeNode>> GetMenu(long userId, string appCode)
  201. //{
  202. // var cacheKey = CacheConst.KeyMenu + $"{userId}-{appCode}";
  203. // var res = await _cache.GetStringAsync(cacheKey);
  204. // return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize<List<AntDesignTreeNode>>(res);
  205. //}
  206. ///// <summary>
  207. ///// 缓存菜单
  208. ///// </summary>
  209. ///// <param name="userId"></param>
  210. ///// <param name="appCode"></param>
  211. ///// <param name="menus"></param>
  212. ///// <returns></returns>
  213. //[NonAction]
  214. //public async Task SetMenu(long userId, string appCode, List<AntDesignTreeNode> menus)
  215. //{
  216. // var cacheKey = CommonConst.CACHE_KEY_MENU + $"{userId}-{appCode}";
  217. // await _cache.SetStringAsync(cacheKey, JSON.Serialize(menus));
  218. // await AddCacheKey(cacheKey);
  219. //}
  220. /// <summary>
  221. /// 获取权限缓存(按钮)
  222. /// </summary>
  223. /// <param name="userId"></param>
  224. /// <returns></returns>
  225. [NonAction]
  226. public async Task<List<string>> GetPermission(long userId)
  227. {
  228. var cacheKey = CacheConst.KeyPermission + userId;
  229. var res = await _cache.GetStringAsync(cacheKey);
  230. return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize<List<string>>(res);
  231. }
  232. /// <summary>
  233. /// 缓存权限
  234. /// </summary>
  235. /// <param name="userId"></param>
  236. /// <param name="permissions"></param>
  237. /// <returns></returns>
  238. [NonAction]
  239. public async Task SetPermission(long userId, List<string> permissions)
  240. {
  241. var cacheKey = CacheConst.KeyPermission + userId;
  242. await _cache.SetStringAsync(cacheKey, JSON.Serialize(permissions));
  243. await AddCacheKey(cacheKey);
  244. }
  245. /// <summary>
  246. /// 获取最大角色数据范围
  247. /// </summary>
  248. /// <param name="userId"></param>
  249. /// <returns></returns>
  250. [NonAction]
  251. public async Task<int?> GetMaxDataScopeType(long userId)
  252. {
  253. var cacheKey = CacheConst.KeyMaxDataScopeType + userId;
  254. var res = await _cache.GetStringAsync(cacheKey);
  255. return string.IsNullOrWhiteSpace(res) ? null : int.Parse(res);
  256. }
  257. /// <summary>
  258. /// 缓存最大角色数据范围
  259. /// </summary>
  260. /// <param name="userId"></param>
  261. /// <param name="dataScopeType"></param>
  262. /// <returns></returns>
  263. [NonAction]
  264. public async Task SetMaxDataScopeType(long userId, int dataScopeType)
  265. {
  266. var cacheKey = CacheConst.KeyMaxDataScopeType + userId;
  267. await _cache.SetStringAsync(cacheKey, dataScopeType.ToString());
  268. await AddCacheKey(cacheKey);
  269. }
  270. }