RedisListService.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. using ServiceStack.Redis;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. namespace CarLocalMeter
  7. {
  8. public class RedisListService
  9. {
  10. private RedisClient _client;
  11. public RedisListService()
  12. {
  13. _client = new RedisClient(AppConfigCache.redisIp, AppConfigCache.redisPort);
  14. }
  15. #region
  16. #region Queue队列(先进先出)
  17. /// <summary>
  18. /// 入队
  19. /// </summary>
  20. /// <param name="listId">集合Id</param>
  21. /// <param name="value">入队的值</param>
  22. /// <param name="timeout">过期时间 秒</param>
  23. public void EnqueueItemOnList(string listId, string value, int timeout = 0)
  24. {
  25. _client.EnqueueItemOnList(listId, value);
  26. if (timeout > 0)
  27. _client.ExpireEntryIn(listId, TimeSpan.FromSeconds(timeout));
  28. //也可以设置某个时间过去,比如下面的方式
  29. //_client.ExpireEntryAt(listId,DateTime.Now.AddDays(7));
  30. }
  31. /// <summary>
  32. /// 出队
  33. /// </summary>
  34. /// <param name="listId">集合Id</param>
  35. /// <returns>出队的值</returns>
  36. public string DequeueItemFromList(string listId)
  37. {
  38. return _client.DequeueItemFromList(listId);
  39. }
  40. /// <summary>
  41. /// 出队(阻塞)
  42. /// </summary>
  43. /// <param name="listId">集合Id</param>
  44. /// <param name="timeOut">阻塞时间(超时时间)</param>
  45. /// <returns>出队的值</returns>
  46. public string BlockingDequeueItemFromList(string listId, TimeSpan? timeOut)
  47. {
  48. return _client.BlockingDequeueItemFromList(listId, timeOut);
  49. }
  50. /// <summary>
  51. /// 从多个list中出队(阻塞)
  52. /// </summary>
  53. /// <param name="listIds">集合Id</param>
  54. /// <param name="timeOut">阻塞时间(超时时间)</param>
  55. /// <returns>返回出队的 listId & Item</returns>
  56. public ItemRef BlockingDequeueItemFromLists(string[] listIds, TimeSpan? timeOut)
  57. {
  58. return _client.BlockingDequeueItemFromLists(listIds, timeOut);
  59. }
  60. #endregion Queue队列(先进先出)
  61. #region Stack栈(后进先出)
  62. /// <summary>
  63. /// 入栈
  64. /// </summary>
  65. /// <param name="listId">集合Id</param>
  66. /// <param name="value">入栈的值</param>
  67. public void PushItemToList(string listId, string value)
  68. {
  69. _client.PushItemToList(listId, value);
  70. }
  71. /// <summary>
  72. /// 入栈,并设置过期时间
  73. /// </summary>
  74. /// <param name="listId">集合Id</param>
  75. /// <param name="value">入栈的值</param>
  76. /// <param name="expireAt">过期时间</param>
  77. public void PushItemToList(string listId, string value, DateTime expireAt)
  78. {
  79. _client.PushItemToList(listId, value);
  80. _client.ExpireEntryAt(listId, expireAt);
  81. }
  82. /// <summary>
  83. /// 入栈,并设置过期时间
  84. /// </summary>
  85. /// <param name="listId">集合Id</param>
  86. /// <param name="value">入栈的值</param>
  87. /// <param name="expireIn">过期时间</param>
  88. public void PushItemToList(string listId, string value, TimeSpan expireIn)
  89. {
  90. _client.PushItemToList(listId, value);
  91. _client.ExpireEntryIn(listId, expireIn);
  92. }
  93. /// <summary>
  94. /// 出栈
  95. /// </summary>
  96. /// <param name="listId">集合Id</param>
  97. /// <returns>出栈的值</returns>
  98. public string PopItemFromList(string listId)
  99. {
  100. return _client.PopItemFromList(listId);
  101. }
  102. /// <summary>
  103. /// 出栈(阻塞)
  104. /// </summary>
  105. /// <param name="listId">集合Id</param>
  106. /// <param name="timeOut">阻塞时间(超时时间)</param>
  107. /// <returns>出栈的值</returns>
  108. public string BlockingPopItemFromList(string listId, TimeSpan? timeOut)
  109. {
  110. return _client.BlockingPopItemFromList(listId, timeOut);
  111. }
  112. /// <summary>
  113. /// 从多个list中出栈一个值(阻塞)
  114. /// </summary>
  115. /// <param name="listIds">集合Id</param>
  116. /// <param name="timeOut">阻塞时间(超时时间)</param>
  117. /// <returns>返回出栈的 listId & Item</returns>
  118. public ItemRef BlockingPopItemFromLists(string[] listIds, TimeSpan? timeOut)
  119. {
  120. return _client.BlockingPopItemFromLists(listIds, timeOut);
  121. }
  122. /// <summary>
  123. /// 从fromListId集合出栈并入栈到toListId集合
  124. /// </summary>
  125. /// <param name="fromListId">出栈集合Id</param>
  126. /// <param name="toListId">入栈集合Id</param>
  127. /// <returns>返回移动的值</returns>
  128. public string PopAndPushItemBetweenLists(string fromListId, string toListId)
  129. {
  130. return _client.PopAndPushItemBetweenLists(fromListId, toListId);
  131. }
  132. /// <summary>
  133. /// 从fromListId集合出栈并入栈到toListId集合(阻塞)
  134. /// </summary>
  135. /// <param name="fromListId">出栈集合Id</param>
  136. /// <param name="toListId">入栈集合Id</param>
  137. /// <param name="timeOut">阻塞时间(超时时间)</param>
  138. /// <returns>返回移动的值</returns>
  139. public string BlockingPopAndPushItemBetweenLists(string fromListId, string toListId, TimeSpan? timeOut)
  140. {
  141. return _client.BlockingPopAndPushItemBetweenLists(fromListId, toListId, timeOut);
  142. }
  143. #endregion Stack栈(后进先出)
  144. #region 赋值
  145. /// <summary>
  146. /// 向list头部添加value值
  147. /// </summary>
  148. public void PrependItemToList(string listId, string value)
  149. {
  150. _client.PrependItemToList(listId, value);
  151. }
  152. /// <summary>
  153. /// 向list头部添加value值,并设置过期时间
  154. /// </summary>
  155. public void PrependItemToList(string listId, string value, DateTime expireAt)
  156. {
  157. _client.PrependItemToList(listId, value);
  158. _client.ExpireEntryAt(listId, expireAt);
  159. }
  160. /// <summary>
  161. /// 向list头部添加value值,并设置过期时间
  162. /// </summary>
  163. public void PrependItemToList(string listId, string value, TimeSpan expireIn)
  164. {
  165. _client.PrependItemToList(listId, value);
  166. _client.ExpireEntryIn(listId, expireIn);
  167. }
  168. /// <summary>
  169. /// 向list中添加value值
  170. /// </summary>
  171. public void AddItemToList(string listId, string value)
  172. {
  173. _client.AddItemToList(listId, value);
  174. }
  175. /// <summary>
  176. /// 向list中添加value值,并设置过期时间
  177. /// </summary>
  178. public void AddItemToList(string listId, string value, DateTime expireAt)
  179. {
  180. _client.AddItemToList(listId, value);
  181. _client.ExpireEntryAt(listId, expireAt);
  182. }
  183. /// <summary>
  184. /// 向list中添加value值,并设置过期时间
  185. /// </summary>
  186. public void AddItemToList(string listId, string value, TimeSpan expireIn)
  187. {
  188. _client.AddItemToList(listId, value);
  189. _client.ExpireEntryIn(listId, expireIn);
  190. }
  191. /// <summary>
  192. /// 向list中添加多个value值
  193. /// </summary>
  194. public void AddRangeToList(string listId, List<string> values)
  195. {
  196. _client.AddRangeToList(listId, values);
  197. }
  198. /// <summary>
  199. /// 向list中添加多个value值,并设置过期时间
  200. /// </summary>
  201. public void AddRangeToList(string listId, List<string> values, DateTime expireAt)
  202. {
  203. _client.AddRangeToList(listId, values);
  204. _client.ExpireEntryAt(listId, expireAt);
  205. }
  206. /// <summary>
  207. /// 向list中添加多个value值,并设置过期时间
  208. /// </summary>
  209. public void AddRangeToList(string listId, List<string> values, TimeSpan expireIn)
  210. {
  211. _client.AddRangeToList(listId, values);
  212. _client.ExpireEntryIn(listId, expireIn);
  213. }
  214. #endregion 赋值
  215. #region 获取值
  216. /// <summary>
  217. /// 获取指定list中包含的数据数量
  218. /// </summary>
  219. public long GetListCount(string listId)
  220. {
  221. return _client.GetListCount(listId);
  222. }
  223. /// <summary>
  224. /// 获取指定list中包含的所有数据集合
  225. /// </summary>
  226. public List<string> GetAllItemsFromList(string listId)
  227. {
  228. return _client.GetAllItemsFromList(listId);
  229. }
  230. /// <summary>
  231. /// 获取指定list中下标从startingFrom到endingAt的值集合
  232. /// </summary>
  233. public List<string> GetRangeFromList(string listId, int startingFrom, int endingAt)
  234. {
  235. return _client.GetRangeFromList(listId, startingFrom, endingAt);
  236. }
  237. #endregion 获取值
  238. #region 删除
  239. /// <summary>
  240. /// 移除指定list中,listId/value,与参数相同的值,并返回移除的数量
  241. /// </summary>
  242. public long RemoveItemFromList(string listId, string value)
  243. {
  244. return _client.RemoveItemFromList(listId, value);
  245. }
  246. /// <summary>
  247. /// 从指定list的尾部移除一个数据,并返回移除的数据
  248. /// </summary>
  249. public string RemoveEndFromList(string listId)
  250. {
  251. return _client.RemoveEndFromList(listId);
  252. }
  253. /// <summary>
  254. /// 从指定list的头部移除一个数据,并返回移除的数据
  255. /// </summary>
  256. public string RemoveStartFromList(string listId)
  257. {
  258. return _client.RemoveStartFromList(listId);
  259. }
  260. #endregion 删除
  261. #region 其它
  262. /// <summary>
  263. /// 清理数据,保持list长度
  264. /// </summary>
  265. /// <param name="listId">集合Id</param>
  266. /// <param name="keepStartingFrom">保留起点</param>
  267. /// <param name="keepEndingAt">保留终点</param>
  268. public void TrimList(string listId, int keepStartingFrom, int keepEndingAt)
  269. {
  270. _client.TrimList(listId, keepStartingFrom, keepEndingAt);
  271. }
  272. #endregion 其它
  273. #region 发布订阅
  274. /// <summary>
  275. /// 发布
  276. /// </summary>
  277. /// <param name="channel">频道</param>
  278. /// <param name="message">消息</param>
  279. public void Publish(string channel, string message)
  280. {
  281. _client.PublishMessage(channel, message);
  282. }
  283. /// <summary>
  284. /// 订阅
  285. /// </summary>
  286. /// <param name="channel">频道</param>
  287. /// <param name="actionOnMessage"></param>
  288. public void Subscribe(string channel, Action<string, string, IRedisSubscription> actionOnMessage)
  289. {
  290. var subscription = _client.CreateSubscription();
  291. subscription.OnSubscribe = c =>
  292. {
  293. Console.WriteLine($"订阅频道{c}");
  294. Console.WriteLine();
  295. };
  296. //取消订阅
  297. subscription.OnUnSubscribe = c =>
  298. {
  299. Console.WriteLine($"取消订阅 {c}");
  300. Console.WriteLine();
  301. };
  302. subscription.OnMessage += (c, s) =>
  303. {
  304. actionOnMessage(c, s, subscription);
  305. };
  306. Console.WriteLine($"开始启动监听 {channel}");
  307. subscription.SubscribeToChannels(channel); //blocking
  308. }
  309. /// <summary>
  310. /// 取消订阅
  311. /// </summary>
  312. /// <param name="channel">频道</param>
  313. public void UnSubscribeFromChannels(string channel)
  314. {
  315. var subscription = _client.CreateSubscription();
  316. subscription.UnSubscribeFromChannels(channel);
  317. }
  318. #endregion 发布订阅
  319. #endregion
  320. }
  321. }