RedisHelper.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. using Common;
  2. using Newtonsoft.Json;
  3. using StackExchange.Redis;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Net;
  8. using System.Threading;
  9. namespace KC.Cache.Redis
  10. {
  11. public class RedisHelper
  12. {
  13. #region 属性
  14. /// <summary>
  15. /// 数据库编号
  16. /// </summary>
  17. private int DbNum { get; }
  18. /// <summary>
  19. /// 连接
  20. /// </summary>
  21. private readonly ConnectionMultiplexer _conn;
  22. #endregion
  23. #region 构造函数
  24. /// <summary>
  25. /// 构造函数
  26. /// </summary>
  27. /// <param name="dbNum">数据库编号</param>
  28. /// <param name="readWriteHosts">链接地址</param>
  29. public RedisHelper()
  30. {
  31. this.DbNum = ConfigHelper.GetValue("RedisDbNum").TryToInt32();
  32. string readWriteHosts = ConfigHelper.GetValue("RedisExchangeHosts");
  33. this._conn = ConnectionMultiplexer.Connect(readWriteHosts);
  34. }
  35. #endregion 构造函数
  36. #region 方法
  37. /// <summary>
  38. /// 单个string值存入
  39. /// </summary>
  40. /// <param name="key"></param>
  41. /// <param name="value"></param>
  42. /// <param name="expiry"></param>
  43. /// <returns></returns>
  44. public bool StringSet(string key, string value, TimeSpan? expiry = default(TimeSpan?))
  45. {
  46. return Do(db => db.StringSet(key, value, expiry));
  47. }
  48. /// <summary>
  49. /// 单个string值存入
  50. /// </summary>
  51. /// <param name="key"></param>
  52. /// <param name="value"></param>
  53. /// <param name="expiry"></param>
  54. /// <returns></returns>
  55. public bool StringSet<T>(string key, T value, TimeSpan? expiry = default(TimeSpan?))
  56. {
  57. return Do(db => db.StringSet(key, ConvertJson(value), expiry));
  58. }
  59. /// <summary>
  60. /// 对象存储
  61. /// </summary>
  62. /// <param name="key"></param>
  63. /// <param name="value"></param>
  64. /// <param name="expiry"></param>
  65. /// <returns></returns>
  66. public void ListSet<T>(string key, T value)
  67. {
  68. Do(db => db.ListRightPush(key, value.TryToJson()));
  69. }
  70. /// <summary>
  71. /// 删除单个key
  72. /// </summary>
  73. /// <param name="key">redis key</param>
  74. /// <returns>是否删除成功</returns>
  75. public bool KeyDelete(string key)
  76. {
  77. return Do(db => db.KeyDelete(key));
  78. }
  79. /// <summary>
  80. /// 获取单个key的值
  81. /// </summary>
  82. /// <param name="key">Redis Key</param>
  83. /// <returns></returns>
  84. public string StringGet(string key)
  85. {
  86. return Do(db => db.StringGet(key));
  87. }
  88. /// <summary>
  89. /// 获取指定key的List
  90. /// </summary>
  91. /// <param name="key"></param>
  92. /// <returns></returns>
  93. public List<T> ListGet<T>(string key)
  94. {
  95. return Do(redis =>
  96. {
  97. try
  98. {
  99. var values = redis.ListRange(key);
  100. return ConvetList<T>(values);
  101. }
  102. catch (Exception)
  103. {
  104. return new List<T>();
  105. }
  106. });
  107. }
  108. /// <summary>
  109. /// 获取所有key
  110. /// </summary>
  111. /// <returns></returns>
  112. public List<string> GetAllKeys()
  113. {
  114. var res = Do(db =>
  115. {
  116. EndPoint[] endpoints = _conn.GetEndPoints();
  117. List<string> keyList = new List<string>();
  118. foreach (EndPoint ep in endpoints)
  119. {
  120. var server = _conn.GetServer(ep);
  121. var keys = server.Keys(DbNum, "*");
  122. foreach (var item in keys)
  123. {
  124. keyList.Add((string)item);
  125. }
  126. };
  127. return keyList;
  128. });
  129. return res;
  130. }
  131. /// <summary>
  132. /// 获取指定key的object
  133. /// </summary>
  134. /// <param name="key"></param>
  135. /// <returns></returns>
  136. public T ListRangeObj<T>(string key)
  137. {;
  138. return Do(redis =>
  139. {
  140. try
  141. {
  142. var values = redis.ListRange(key);
  143. var content = values.Count() > 0 ? values[0] : new RedisValue();
  144. return ConvertObj<T>(content);
  145. }
  146. catch (Exception)
  147. {
  148. Thread.Sleep(1000);
  149. var values = redis.ListRange(key);
  150. var content = values.Count() > 0 ? values[0] : new RedisValue();
  151. return ConvertObj<T>(content);
  152. }
  153. });
  154. }
  155. /// <summary>
  156. /// 判断key是否存储
  157. /// </summary>
  158. /// <param name="key">redis key</param>
  159. /// <returns></returns>
  160. public bool KeyExists(string key)
  161. {
  162. return Do(db => db.KeyExists(key));
  163. }
  164. /// <summary>
  165. /// 执行操作
  166. /// </summary>
  167. /// <typeparam name="T"></typeparam>
  168. /// <param name="func"></param>
  169. /// <returns></returns>
  170. private T Do<T>(Func<IDatabase, T> func)
  171. {
  172. var database = _conn.GetDatabase(DbNum);
  173. return func(database);
  174. }
  175. /// <summary>
  176. /// 设置Key的时间
  177. /// </summary>
  178. /// <param name="key">redis key</param>
  179. /// <param name="expiry"></param>
  180. /// <returns></returns>
  181. public bool KeyExpire(string key, TimeSpan? expiry = default(TimeSpan?))
  182. {
  183. return Do(db => db.KeyExpire(key, expiry));
  184. }
  185. /// <summary>
  186. /// 删除多个key
  187. /// </summary>
  188. /// <param name="keys">rediskey</param>
  189. /// <returns>成功删除的个数</returns>
  190. public long KeyDelete(List<string> keys)
  191. {
  192. return Do(db => db.KeyDelete(ConvertRedisKeys(keys)));
  193. }
  194. #endregion
  195. #region 转换
  196. /// <summary>
  197. /// 转换成集合
  198. /// </summary>
  199. /// <typeparam name="T"></typeparam>
  200. /// <param name="values"></param>
  201. /// <returns></returns>
  202. private List<T> ConvetList<T>(RedisValue[] values)
  203. {
  204. List<T> result = new List<T>();
  205. //try
  206. //{
  207. // //一个Key下面存了多个相同实体
  208. // foreach (RedisValue value in values)
  209. // {
  210. // var model = ConvertObj<T>(value);
  211. // result.Add(model);
  212. // }
  213. //}
  214. //catch (Exception e)
  215. //{
  216. //一个Key下面存的是一个集合
  217. foreach (RedisValue value in values)
  218. {
  219. List<T> temp = JsonConvert.DeserializeObject<List<T>>(value);
  220. result = result.Concat(temp).ToList();
  221. }
  222. // }
  223. return result;
  224. }
  225. /// <summary>
  226. /// 转换成Json字符串
  227. /// </summary>
  228. /// <typeparam name="T"></typeparam>
  229. /// <param name="value"></param>
  230. /// <returns></returns>
  231. private string ConvertJson<T>(T value)
  232. {
  233. string result = value is string ? value.ToString() : JsonConvert.SerializeObject(value);
  234. return result;
  235. }
  236. /// <summary>
  237. /// 转换成对象
  238. /// </summary>
  239. /// <typeparam name="T"></typeparam>
  240. /// <param name="value"></param>
  241. /// <returns></returns>
  242. private T ConvertObj<T>(RedisValue value)
  243. {
  244. if (!value.IsNullOrEmpty)
  245. {
  246. var val = value.ToString();
  247. try
  248. {
  249. if (!val.IsEmpty() && val.IsJson())
  250. return JsonConvert.DeserializeObject<T>(val);
  251. return default(T);
  252. }
  253. catch (Exception ex)
  254. {
  255. throw;
  256. }
  257. }
  258. return default(T);
  259. }
  260. /// <summary>
  261. /// 批量转换成RedisKey
  262. /// </summary>
  263. /// <param name="redisKeys"></param>
  264. /// <returns></returns>
  265. private RedisKey[] ConvertRedisKeys(List<string> redisKeys)
  266. {
  267. return redisKeys.Select(redisKey => (RedisKey)redisKey).ToArray();
  268. }
  269. #endregion
  270. }
  271. }