飞星
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

599 lignes
20 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Runtime.Serialization.Formatters.Binary;
  6. using System.Threading.Tasks;
  7. using Microsoft.Extensions.Configuration;
  8. using StackExchange.Redis;
  9. namespace Permission.Redis
  10. {
  11. public class RedisService : IRedisService
  12. {
  13. private readonly IConfiguration _config;
  14. private IDatabase _db;
  15. public RedisService(IConfiguration config, string databaseName, int db = 0)
  16. {
  17. _config = config;
  18. _db = RedisClientSingleton.GetInstance(_config).GetDatabase(databaseName, db);
  19. }
  20. #region String 操作
  21. public bool StringSet(string redisKey, string redisValue, TimeSpan? expiry = null)
  22. {
  23. redisKey = AddKeyPrefix(redisKey);
  24. return _db.StringSet(redisKey, redisValue, expiry);
  25. }
  26. public bool StringSet(IEnumerable<KeyValuePair<string, string>> keyValuePairs)
  27. {
  28. var pairs = keyValuePairs.Select(x => new KeyValuePair<RedisKey, RedisValue>(AddKeyPrefix(x.Key), x.Value));
  29. return _db.StringSet(pairs.ToArray());
  30. }
  31. public string StringGet(string redisKey, TimeSpan? expiry = null)
  32. {
  33. redisKey = AddKeyPrefix(redisKey);
  34. return _db.StringGet(redisKey);
  35. }
  36. public bool StringSet<T>(string redisKey, T redisValue, TimeSpan? expiry = null)
  37. {
  38. redisKey = AddKeyPrefix(redisKey);
  39. var json = Serialize(redisValue);
  40. return _db.StringSet(redisKey, json, expiry);
  41. }
  42. public T StringGet<T>(string redisKey, TimeSpan? expiry = null)
  43. {
  44. redisKey = AddKeyPrefix(redisKey);
  45. return Deserialize<T>(_db.StringGet(redisKey));
  46. }
  47. #region String 异步操作
  48. public async Task<bool> StringSetAsync(string redisKey, string redisValue, TimeSpan? expiry = null)
  49. {
  50. redisKey = AddKeyPrefix(redisKey);
  51. return await _db.StringSetAsync(redisKey, redisValue, expiry);
  52. }
  53. public async Task<bool> StringSetAsync(IEnumerable<KeyValuePair<string, string>> keyValuePairs)
  54. {
  55. var pairs = keyValuePairs.Select(x => new KeyValuePair<RedisKey, RedisValue>(AddKeyPrefix(x.Key), x.Value));
  56. return await _db.StringSetAsync(pairs.ToArray());
  57. }
  58. public async Task<string> StringGetAsync(string redisKey, string redisValue, TimeSpan? expiry = null)
  59. {
  60. redisKey = AddKeyPrefix(redisKey);
  61. return await _db.StringGetAsync(redisKey);
  62. }
  63. public async Task<bool> StringSetAsync<T>(string redisKey, T redisValue, TimeSpan? expiry = null)
  64. {
  65. redisKey = AddKeyPrefix(redisKey);
  66. var json = Serialize(redisValue);
  67. return await _db.StringSetAsync(redisKey, json, expiry);
  68. }
  69. public async Task<T> StringGetAsync<T>(string redisKey, TimeSpan? expiry = null)
  70. {
  71. redisKey = AddKeyPrefix(redisKey);
  72. return Deserialize<T>(await _db.StringGetAsync(redisKey));
  73. }
  74. #endregion
  75. #endregion
  76. #region Hash 操作
  77. public bool HashExists(string redisKey, string hashField)
  78. {
  79. redisKey = AddKeyPrefix(redisKey);
  80. return _db.HashExists(redisKey, hashField);
  81. }
  82. public bool HashDelete(string redisKey, string hashField)
  83. {
  84. redisKey = AddKeyPrefix(redisKey);
  85. return _db.HashDelete(redisKey, hashField);
  86. }
  87. public long HashDelete(string redisKey, IEnumerable<string> hashFields)
  88. {
  89. redisKey = AddKeyPrefix(redisKey);
  90. var fields = hashFields.Select(x => (RedisValue)x);
  91. return _db.HashDelete(redisKey, fields.ToArray());
  92. }
  93. public bool HashSet(string redisKey, string hashField, string value)
  94. {
  95. redisKey = AddKeyPrefix(redisKey);
  96. return _db.HashSet(redisKey, hashField, value);
  97. }
  98. public void HashSet(string redisKey, IEnumerable<KeyValuePair<string, string>> hashFields)
  99. {
  100. redisKey = AddKeyPrefix(redisKey);
  101. var entries = hashFields.Select(x => new HashEntry(x.Key, x.Value));
  102. _db.HashSet(redisKey, entries.ToArray());
  103. }
  104. public string HashGet(string redisKey, string hashField)
  105. {
  106. redisKey = AddKeyPrefix(redisKey);
  107. return _db.HashGet(redisKey, hashField);
  108. }
  109. public IEnumerable<string> HashGet(string redisKey, IEnumerable<string> hashFields)
  110. {
  111. redisKey = AddKeyPrefix(redisKey);
  112. var fields = hashFields.Select(x => (RedisValue)x);
  113. return ConvertStrings(_db.HashGet(redisKey, fields.ToArray()));
  114. }
  115. public IEnumerable<string> HashKeys(string redisKey)
  116. {
  117. redisKey = AddKeyPrefix(redisKey);
  118. return ConvertStrings(_db.HashKeys(redisKey));
  119. }
  120. public IEnumerable<string> HashValues(string redisKey)
  121. {
  122. redisKey = AddKeyPrefix(redisKey);
  123. return ConvertStrings(_db.HashValues(redisKey));
  124. }
  125. public bool HashSet<T>(string redisKey, string hashField, T redisValue)
  126. {
  127. redisKey = AddKeyPrefix(redisKey);
  128. var json = Serialize(redisValue);
  129. return _db.HashSet(redisKey, hashField, json);
  130. }
  131. public T HashGet<T>(string redisKey, string hashField)
  132. {
  133. redisKey = AddKeyPrefix(redisKey);
  134. return Deserialize<T>(_db.HashGet(redisKey, hashField));
  135. }
  136. #region Hash 异步操作
  137. public async Task<bool> HashExistsAsync(string redisKey, string hashField)
  138. {
  139. redisKey = AddKeyPrefix(redisKey);
  140. return await _db.HashExistsAsync(redisKey, hashField);
  141. }
  142. public async Task<bool> HashDeleteAsync(string redisKey, string hashField)
  143. {
  144. redisKey = AddKeyPrefix(redisKey);
  145. return await _db.HashDeleteAsync(redisKey, hashField);
  146. }
  147. public async Task<long> HashDeleteAsync(string redisKey, IEnumerable<string> hashFields)
  148. {
  149. redisKey = AddKeyPrefix(redisKey);
  150. var fields = hashFields.Select(x => (RedisValue)x);
  151. return await _db.HashDeleteAsync(redisKey, fields.ToArray());
  152. }
  153. public async Task<bool> HashSetAsync(string redisKey, string hashField, string value)
  154. {
  155. redisKey = AddKeyPrefix(redisKey);
  156. return await _db.HashSetAsync(redisKey, hashField, value);
  157. }
  158. public async Task HashSetAsync(string redisKey, IEnumerable<KeyValuePair<string, string>> hashFields)
  159. {
  160. redisKey = AddKeyPrefix(redisKey);
  161. var entries = hashFields.Select(x => new HashEntry(AddKeyPrefix(x.Key), x.Value));
  162. await _db.HashSetAsync(redisKey, entries.ToArray());
  163. }
  164. public async Task<string> HashGetAsync(string redisKey, string hashField)
  165. {
  166. redisKey = AddKeyPrefix(redisKey);
  167. return await _db.HashGetAsync(redisKey, hashField);
  168. }
  169. public async Task<IEnumerable<string>> HashGetAsync(string redisKey, IEnumerable<string> hashFields, string value)
  170. {
  171. redisKey = AddKeyPrefix(redisKey);
  172. var fields = hashFields.Select(x => (RedisValue)x);
  173. return ConvertStrings(await _db.HashGetAsync(redisKey, fields.ToArray()));
  174. }
  175. public async Task<IEnumerable<string>> HashKeysAsync(string redisKey)
  176. {
  177. redisKey = AddKeyPrefix(redisKey);
  178. return ConvertStrings(await _db.HashKeysAsync(redisKey));
  179. }
  180. public async Task<IEnumerable<string>> HashValuesAsync(string redisKey)
  181. {
  182. redisKey = AddKeyPrefix(redisKey);
  183. return ConvertStrings(await _db.HashValuesAsync(redisKey));
  184. }
  185. public async Task<bool> HashSetAsync<T>(string redisKey, string hashField, T value)
  186. {
  187. redisKey = AddKeyPrefix(redisKey);
  188. var json = Serialize(value);
  189. return await _db.HashSetAsync(redisKey, hashField, json);
  190. }
  191. public async Task<T> HashGetAsync<T>(string redisKey, string hashField)
  192. {
  193. redisKey = AddKeyPrefix(redisKey);
  194. return Deserialize<T>(await _db.HashGetAsync(redisKey, hashField));
  195. }
  196. #endregion
  197. #endregion
  198. #region List 操作
  199. public string ListLeftPop(string redisKey)
  200. {
  201. redisKey = AddKeyPrefix(redisKey);
  202. return _db.ListLeftPop(redisKey);
  203. }
  204. public string ListRightPop(string redisKey)
  205. {
  206. redisKey = AddKeyPrefix(redisKey);
  207. return _db.ListRightPop(redisKey);
  208. }
  209. public long ListRemove(string redisKey, string redisValue)
  210. {
  211. redisKey = AddKeyPrefix(redisKey);
  212. return _db.ListRemove(redisKey, redisValue);
  213. }
  214. public long ListRightPush(string redisKey, string redisValue)
  215. {
  216. redisKey = AddKeyPrefix(redisKey);
  217. return _db.ListRightPush(redisKey, redisValue);
  218. }
  219. public long ListLeftPush(string redisKey, string redisValue)
  220. {
  221. redisKey = AddKeyPrefix(redisKey);
  222. return _db.ListLeftPush(redisKey, redisValue);
  223. }
  224. public long ListLength(string redisKey)
  225. {
  226. redisKey = AddKeyPrefix(redisKey);
  227. return _db.ListLength(redisKey);
  228. }
  229. public IEnumerable<string> ListRange(string redisKey, long start = 0, long stop = -1)
  230. {
  231. redisKey = AddKeyPrefix(redisKey);
  232. return ConvertStrings(_db.ListRange(redisKey, start, stop));
  233. }
  234. public T ListLeftPop<T>(string redisKey)
  235. {
  236. redisKey = AddKeyPrefix(redisKey);
  237. return Deserialize<T>(_db.ListLeftPop(redisKey));
  238. }
  239. public T ListRightPop<T>(string redisKey)
  240. {
  241. redisKey = AddKeyPrefix(redisKey);
  242. return Deserialize<T>(_db.ListRightPop(redisKey));
  243. }
  244. public long ListRightPush<T>(string redisKey, T redisValue)
  245. {
  246. redisKey = AddKeyPrefix(redisKey);
  247. return _db.ListRightPush(redisKey, Serialize(redisValue));
  248. }
  249. public long ListLeftPush<T>(string redisKey, T redisValue)
  250. {
  251. redisKey = AddKeyPrefix(redisKey);
  252. return _db.ListLeftPush(redisKey, Serialize(redisValue));
  253. }
  254. #region List 异步操作
  255. public async Task<string> ListLeftPopAsync(string redisKey)
  256. {
  257. redisKey = AddKeyPrefix(redisKey);
  258. return await _db.ListLeftPopAsync(redisKey);
  259. }
  260. public async Task<string> ListRightPopAsync(string redisKey)
  261. {
  262. redisKey = AddKeyPrefix(redisKey);
  263. return await _db.ListRightPopAsync(redisKey);
  264. }
  265. public async Task<long> ListRemoveAsync(string redisKey, string redisValue)
  266. {
  267. redisKey = AddKeyPrefix(redisKey);
  268. return await _db.ListRemoveAsync(redisKey, redisValue);
  269. }
  270. public async Task<long> ListRightPushAsync(string redisKey, string redisValue)
  271. {
  272. redisKey = AddKeyPrefix(redisKey);
  273. return await _db.ListRightPushAsync(redisKey, redisValue);
  274. }
  275. public async Task<long> ListLeftPushAsync(string redisKey, string redisValue)
  276. {
  277. redisKey = AddKeyPrefix(redisKey);
  278. return await _db.ListLeftPushAsync(redisKey, redisValue);
  279. }
  280. public async Task<long> ListLengthAsync(string redisKey)
  281. {
  282. redisKey = AddKeyPrefix(redisKey);
  283. return await _db.ListLengthAsync(redisKey);
  284. }
  285. public async Task<IEnumerable<string>> ListRangeAsync(string redisKey, long start = 0, long stop = -1)
  286. {
  287. redisKey = AddKeyPrefix(redisKey);
  288. var query = await _db.ListRangeAsync(redisKey, start, stop);
  289. return query.Select(x => x.ToString());
  290. }
  291. public async Task<T> ListLeftPopAsync<T>(string redisKey)
  292. {
  293. redisKey = AddKeyPrefix(redisKey);
  294. return Deserialize<T>(await _db.ListLeftPopAsync(redisKey));
  295. }
  296. public async Task<T> ListRightPopAsync<T>(string redisKey)
  297. {
  298. redisKey = AddKeyPrefix(redisKey);
  299. return Deserialize<T>(await _db.ListRightPopAsync(redisKey));
  300. }
  301. public async Task<long> ListRightPushAsync<T>(string redisKey, T redisValue)
  302. {
  303. redisKey = AddKeyPrefix(redisKey);
  304. return await _db.ListRightPushAsync(redisKey, Serialize(redisValue));
  305. }
  306. public async Task<long> ListLeftPushAsync<T>(string redisKey, T redisValue)
  307. {
  308. redisKey = AddKeyPrefix(redisKey);
  309. return await _db.ListLeftPushAsync(redisKey, Serialize(redisValue));
  310. }
  311. #endregion
  312. #endregion
  313. #region SortedSet 操作
  314. public bool SortedSetAdd(string redisKey, string member, double score)
  315. {
  316. redisKey = AddKeyPrefix(redisKey);
  317. return _db.SortedSetAdd(redisKey, member, score);
  318. }
  319. public IEnumerable<string> SortedSetRangeByRank(string redisKey, long start = 0L, long stop = -1L,
  320. OrderType order = OrderType.Ascending)
  321. {
  322. redisKey = AddKeyPrefix(redisKey);
  323. return _db.SortedSetRangeByRank(redisKey, start, stop, (Order)order).Select(x => x.ToString());
  324. }
  325. public long SortedSetLength(string redisKey)
  326. {
  327. redisKey = AddKeyPrefix(redisKey);
  328. return _db.SortedSetLength(redisKey);
  329. }
  330. public bool SortedSetLength(string redisKey, string memebr)
  331. {
  332. redisKey = AddKeyPrefix(redisKey);
  333. return _db.SortedSetRemove(redisKey, memebr);
  334. }
  335. public bool SortedSetAdd<T>(string redisKey, T member, double score)
  336. {
  337. redisKey = AddKeyPrefix(redisKey);
  338. var json = Serialize(member);
  339. return _db.SortedSetAdd(redisKey, json, score);
  340. }
  341. public double SortedSetIncrement(string redisKey, string member, double value = 1)
  342. {
  343. redisKey = AddKeyPrefix(redisKey);
  344. return _db.SortedSetIncrement(redisKey, member, value);
  345. }
  346. #region SortedSet 异步操作
  347. public async Task<bool> SortedSetAddAsync(string redisKey, string member, double score)
  348. {
  349. redisKey = AddKeyPrefix(redisKey);
  350. return await _db.SortedSetAddAsync(redisKey, member, score);
  351. }
  352. public async Task<IEnumerable<string>> SortedSetRangeByRankAsync(string redisKey)
  353. {
  354. redisKey = AddKeyPrefix(redisKey);
  355. return ConvertStrings(await _db.SortedSetRangeByRankAsync(redisKey));
  356. }
  357. public async Task<long> SortedSetLengthAsync(string redisKey)
  358. {
  359. redisKey = AddKeyPrefix(redisKey);
  360. return await _db.SortedSetLengthAsync(redisKey);
  361. }
  362. public async Task<bool> SortedSetRemoveAsync(string redisKey, string memebr)
  363. {
  364. redisKey = AddKeyPrefix(redisKey);
  365. return await _db.SortedSetRemoveAsync(redisKey, memebr);
  366. }
  367. public async Task<bool> SortedSetAddAsync<T>(string redisKey, T member, double score)
  368. {
  369. redisKey = AddKeyPrefix(redisKey);
  370. var json = Serialize(member);
  371. return await _db.SortedSetAddAsync(redisKey, json, score);
  372. }
  373. public async Task<double> SortedSetIncrementAsync(string redisKey, string member, double value = 1)
  374. {
  375. redisKey = AddKeyPrefix(redisKey);
  376. return await _db.SortedSetIncrementAsync(redisKey, member, value);
  377. }
  378. #endregion
  379. #endregion
  380. #region key 操作
  381. public bool KeyDelete(string redisKey)
  382. {
  383. redisKey = AddKeyPrefix(redisKey);
  384. return _db.KeyDelete(redisKey);
  385. }
  386. public long KeyDelete(IEnumerable<string> redisKeys)
  387. {
  388. var keys = redisKeys.Select(x => (RedisKey)AddKeyPrefix(x));
  389. return _db.KeyDelete(keys.ToArray());
  390. }
  391. public bool KeyExists(string redisKey)
  392. {
  393. redisKey = AddKeyPrefix(redisKey);
  394. return _db.KeyExists(redisKey);
  395. }
  396. public bool KeyRename(string redisKey, string redisNewKey)
  397. {
  398. redisKey = AddKeyPrefix(redisKey);
  399. return _db.KeyRename(redisKey, redisNewKey);
  400. }
  401. public bool KeyExpire(string redisKey, TimeSpan? expiry)
  402. {
  403. redisKey = AddKeyPrefix(redisKey);
  404. return _db.KeyExpire(redisKey, expiry);
  405. }
  406. #region key 异步操作
  407. public async Task<bool> KeyDeleteAsync(string redisKey)
  408. {
  409. redisKey = AddKeyPrefix(redisKey);
  410. return await _db.KeyDeleteAsync(redisKey);
  411. }
  412. public async Task<long> KeyDeleteAsync(IEnumerable<string> redisKeys)
  413. {
  414. var keys = redisKeys.Select(x => (RedisKey)AddKeyPrefix(x));
  415. return await _db.KeyDeleteAsync(keys.ToArray());
  416. }
  417. public async Task<bool> KeyExistsAsync(string redisKey)
  418. {
  419. redisKey = AddKeyPrefix(redisKey);
  420. return await _db.KeyExistsAsync(redisKey);
  421. }
  422. public async Task<bool> KeyRenameAsync(string redisKey, string redisNewKey)
  423. {
  424. redisKey = AddKeyPrefix(redisKey);
  425. return await _db.KeyRenameAsync(redisKey, redisNewKey);
  426. }
  427. public async Task<bool> KeyExpireAsync(string redisKey, TimeSpan? expiry)
  428. {
  429. redisKey = AddKeyPrefix(redisKey);
  430. return await _db.KeyExpireAsync(redisKey, expiry);
  431. }
  432. #endregion
  433. #endregion
  434. #region 序列化对象
  435. /// <summary>
  436. /// 添加 Key 的前缀
  437. /// </summary>
  438. /// <param name="key"></param>
  439. /// <returns></returns>
  440. private string AddKeyPrefix(string key)
  441. {
  442. var syskey = _config.GetSection("RedisConfig:RedisKey").Value;
  443. return syskey + key;
  444. }
  445. /// <summary>
  446. /// 转换为字符串
  447. /// </summary>
  448. /// <typeparam name="T"></typeparam>
  449. /// <param name="list"></param>
  450. /// <returns></returns>
  451. private static IEnumerable<string> ConvertStrings<T>(IEnumerable<T> list) where T : struct
  452. {
  453. if (list == null) throw new ArgumentNullException(nameof(list));
  454. return list.Select(x => x.ToString());
  455. }
  456. /// <summary>
  457. /// 序列化对象
  458. /// </summary>
  459. /// <param name="o"></param>
  460. /// <returns></returns>
  461. static byte[] Serialize(object obj)
  462. {
  463. if (obj == null)
  464. return null;
  465. var binaryFormatter = new BinaryFormatter();
  466. using (var memoryStream = new MemoryStream())
  467. {
  468. binaryFormatter.Serialize(memoryStream, obj);
  469. var data = memoryStream.ToArray();
  470. return data;
  471. }
  472. }
  473. /// <summary>
  474. /// 反序列化对象
  475. /// </summary>
  476. /// <typeparam name="T"></typeparam>
  477. /// <param name="data"></param>
  478. /// <returns></returns>
  479. static T Deserialize<T>(byte[] data)
  480. {
  481. if (data == null)
  482. return default(T);
  483. var binaryFormatter = new BinaryFormatter();
  484. using (var memoryStream = new MemoryStream(data))
  485. {
  486. var result = (T)binaryFormatter.Deserialize(memoryStream);
  487. return result;
  488. }
  489. }
  490. #endregion
  491. }
  492. }