RedisBasketRepository.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using Microsoft.Extensions.Logging;
  2. using Newtonsoft.Json;
  3. using Ropin.Core.Common;
  4. using StackExchange.Redis;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace Ropin.Core.Extensions.Redis
  11. {
  12. public class RedisBasketRepository : IRedisBasketRepository
  13. {
  14. private readonly ILogger<RedisBasketRepository> _logger;
  15. private readonly ConnectionMultiplexer _redis;
  16. private readonly IDatabase _database;
  17. public RedisBasketRepository(ILogger<RedisBasketRepository> logger, ConnectionMultiplexer redis)
  18. {
  19. _logger = logger ?? throw new ArgumentNullException(nameof(logger));
  20. _redis = redis ?? throw new ArgumentNullException(nameof(redis));
  21. _database = redis.GetDatabase();
  22. }
  23. private IServer GetServer()
  24. {
  25. var endpoint = _redis.GetEndPoints();
  26. return _redis.GetServer(endpoint.First());
  27. }
  28. public async Task Clear()
  29. {
  30. foreach (var endPoint in _redis.GetEndPoints())
  31. {
  32. var server = GetServer();
  33. foreach (var key in server.Keys())
  34. {
  35. await _database.KeyDeleteAsync(key);
  36. }
  37. }
  38. }
  39. public async Task<bool> Exist(string key)
  40. {
  41. return await _database.KeyExistsAsync(key);
  42. }
  43. public async Task<string> GetValue(string key)
  44. {
  45. return await _database.StringGetAsync(key);
  46. }
  47. public async Task Remove(string key)
  48. {
  49. await _database.KeyDeleteAsync(key);
  50. }
  51. public async Task Set(string key, object value, TimeSpan cacheTime)
  52. {
  53. if (value != null)
  54. {
  55. if (value is string cacheValue)
  56. {
  57. // 字符串无需序列化
  58. await _database.StringSetAsync(key, cacheValue, cacheTime);
  59. }
  60. else
  61. {
  62. //序列化,将object值生成RedisValue
  63. await _database.StringSetAsync(key, SerializeHelper.Serialize(value), cacheTime);
  64. }
  65. }
  66. }
  67. public async Task<TEntity> Get<TEntity>(string key)
  68. {
  69. var value = await _database.StringGetAsync(key);
  70. if (value.HasValue)
  71. {
  72. //需要用的反序列化,将Redis存储的Byte[],进行反序列化
  73. return SerializeHelper.Deserialize<TEntity>(value);
  74. }
  75. else
  76. {
  77. return default(TEntity);
  78. }
  79. }
  80. /// <summary>
  81. /// 根据key获取RedisValue
  82. /// </summary>
  83. /// <typeparam name="T"></typeparam>
  84. /// <param name="redisKey"></param>
  85. /// <returns></returns>
  86. public async Task<RedisValue[]> ListRangeAsync(string redisKey)
  87. {
  88. return await _database.ListRangeAsync(redisKey);
  89. }
  90. /// <summary>
  91. /// 在列表头部插入值。如果键不存在,先创建再插入值
  92. /// </summary>
  93. /// <param name="redisKey"></param>
  94. /// <param name="redisValue"></param>
  95. /// <returns></returns>
  96. public async Task<long> ListLeftPushAsync(string redisKey, string redisValue, int db = -1)
  97. {
  98. return await _database.ListLeftPushAsync(redisKey, redisValue);
  99. }
  100. /// <summary>
  101. /// 在列表尾部插入值。如果键不存在,先创建再插入值
  102. /// </summary>
  103. /// <param name="redisKey"></param>
  104. /// <param name="redisValue"></param>
  105. /// <returns></returns>
  106. public async Task<long> ListRightPushAsync(string redisKey, string redisValue, int db = -1)
  107. {
  108. return await _database.ListRightPushAsync(redisKey, redisValue);
  109. }
  110. /// <summary>
  111. /// 在列表尾部插入数组集合。如果键不存在,先创建再插入值
  112. /// </summary>
  113. /// <param name="redisKey"></param>
  114. /// <param name="redisValue"></param>
  115. /// <returns></returns>
  116. public async Task<long> ListRightPushAsync(string redisKey, IEnumerable<string> redisValue, int db = -1)
  117. {
  118. var redislist = new List<RedisValue>();
  119. foreach (var item in redisValue)
  120. {
  121. redislist.Add(item);
  122. }
  123. return await _database.ListRightPushAsync(redisKey, redislist.ToArray());
  124. }
  125. /// <summary>
  126. /// 移除并返回存储在该键列表的第一个元素 反序列化
  127. /// </summary>
  128. /// <param name="redisKey"></param>
  129. /// <returns></returns>
  130. public async Task<T> ListLeftPopAsync<T>(string redisKey, int db = -1) where T : class
  131. {
  132. return JsonConvert.DeserializeObject<T>(await _database.ListLeftPopAsync(redisKey));
  133. }
  134. /// <summary>
  135. /// 移除并返回存储在该键列表的最后一个元素 反序列化
  136. /// 只能是对象集合
  137. /// </summary>
  138. /// <param name="redisKey"></param>
  139. /// <returns></returns>
  140. public async Task<T> ListRightPopAsync<T>(string redisKey, int db = -1) where T : class
  141. {
  142. return JsonConvert.DeserializeObject<T>(await _database.ListRightPopAsync(redisKey));
  143. }
  144. /// <summary>
  145. /// 移除并返回存储在该键列表的第一个元素
  146. /// </summary>
  147. /// <param name="redisKey"></param>
  148. /// <param name="db"></param>
  149. /// <returns></returns>
  150. public async Task<string> ListLeftPopAsync(string redisKey, int db = -1)
  151. {
  152. return await _database.ListLeftPopAsync(redisKey);
  153. }
  154. /// <summary>
  155. /// 移除并返回存储在该键列表的最后一个元素
  156. /// </summary>
  157. /// <typeparam name="T"></typeparam>
  158. /// <param name="redisKey"></param>
  159. /// <param name="db"></param>
  160. /// <returns></returns>
  161. public async Task<string> ListRightPopAsync(string redisKey, int db = -1)
  162. {
  163. return await _database.ListRightPopAsync(redisKey);
  164. }
  165. /// <summary>
  166. /// 列表长度
  167. /// </summary>
  168. /// <param name="redisKey"></param>
  169. /// <param name="db"></param>
  170. /// <returns></returns>
  171. public async Task<long> ListLengthAsync(string redisKey, int db = -1)
  172. {
  173. return await _database.ListLengthAsync(redisKey);
  174. }
  175. /// <summary>
  176. /// 返回在该列表上键所对应的元素
  177. /// </summary>
  178. /// <param name="redisKey"></param>
  179. /// <returns></returns>
  180. public async Task<IEnumerable<string>> ListRangeAsync(string redisKey, int db = -1)
  181. {
  182. var result = await _database.ListRangeAsync(redisKey);
  183. return result.Select(o => o.ToString());
  184. }
  185. /// <summary>
  186. /// 根据索引获取指定位置数据
  187. /// </summary>
  188. /// <param name="redisKey"></param>
  189. /// <param name="start"></param>
  190. /// <param name="stop"></param>
  191. /// <param name="db"></param>
  192. /// <returns></returns>
  193. public async Task<IEnumerable<string>> ListRangeAsync(string redisKey, int start, int stop, int db = -1)
  194. {
  195. var result = await _database.ListRangeAsync(redisKey, start, stop);
  196. return result.Select(o => o.ToString());
  197. }
  198. /// <summary>
  199. /// 删除List中的元素 并返回删除的个数
  200. /// </summary>
  201. /// <param name="redisKey">key</param>
  202. /// <param name="redisValue">元素</param>
  203. /// <param name="type">大于零 : 从表头开始向表尾搜索,小于零 : 从表尾开始向表头搜索,等于零:移除表中所有与 VALUE 相等的值</param>
  204. /// <param name="db"></param>
  205. /// <returns></returns>
  206. public async Task<long> ListDelRangeAsync(string redisKey, string redisValue, long type = 0, int db = -1)
  207. {
  208. return await _database.ListRemoveAsync(redisKey, redisValue, type);
  209. }
  210. /// <summary>
  211. /// 清空List
  212. /// </summary>
  213. /// <param name="redisKey"></param>
  214. /// <param name="db"></param>
  215. public async Task ListClearAsync(string redisKey, int db = -1)
  216. {
  217. await _database.ListTrimAsync(redisKey, 1, 0);
  218. }
  219. }
  220. }