RedisHelper.cs 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Newtonsoft.Json;
  6. using StackExchange.Redis;
  7. namespace Masuit.Tools.Core.NoSQL
  8. {
  9. /// <summary>
  10. /// Redis操作
  11. /// </summary>
  12. public class RedisHelper
  13. {
  14. private int DbNum { get; }
  15. private readonly ConnectionMultiplexer _conn;
  16. /// <summary>
  17. /// 自定义键
  18. /// </summary>
  19. public string CustomKey;
  20. #region 构造函数
  21. /// <summary>
  22. /// 构造函数,使用该构造函数需要先配置链接字符串,连接字符串通过RedisConnectionHelp.RedisConnectionString属性进行获取,若未正确配置,将按默认值“127.0.0.1:6379,allowadmin=true”进行操作<br/>
  23. /// </summary>
  24. /// <param name="dbNum">数据库编号</param>
  25. public RedisHelper(int dbNum = 0) : this(dbNum, null)
  26. {
  27. }
  28. /// <summary>
  29. /// 构造函数
  30. /// </summary>
  31. /// <param name="dbNum">数据库的编号</param>
  32. /// <param name="readWriteHosts">Redis服务器连接字符串,格式:127.0.0.1:6379,allowadmin=true</param>
  33. public RedisHelper(int dbNum, string readWriteHosts)
  34. {
  35. DbNum = dbNum;
  36. _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? RedisConnectionHelp.Instance : RedisConnectionHelp.GetConnectionMultiplexer(readWriteHosts);
  37. }
  38. /// <summary>
  39. /// 从对象池获取默认实例
  40. /// </summary>
  41. /// <param name="db">数据库的编号</param>
  42. /// <returns></returns>
  43. public static RedisHelper GetInstance(int db = 0)
  44. {
  45. return new RedisHelper(db);
  46. }
  47. /// <summary>
  48. /// 从对象池获取默认实例
  49. /// </summary>
  50. /// <param name="conn">Redis服务器连接字符串,格式:127.0.0.1:6379,allowadmin=true</param>
  51. /// <param name="db">数据库的编号</param>
  52. /// <returns></returns>
  53. public static RedisHelper GetInstance(string conn = "127.0.0.1:6379,allowadmin=true", int db = 0)
  54. {
  55. return new RedisHelper(db, conn);
  56. }
  57. #endregion 构造函数
  58. #region String
  59. #region 同步方法
  60. /// <summary>
  61. /// 保存单个key value
  62. /// </summary>
  63. /// <param name="key">Redis Key</param>
  64. /// <param name="value">保存的值</param>
  65. /// <param name="expiry">过期时间</param>
  66. /// <returns>是否保存成功</returns>
  67. public bool SetString(string key, string value, TimeSpan? expiry = default(TimeSpan?))
  68. {
  69. key = AddSysCustomKey(key);
  70. return Do(db => db.StringSet(key, value, expiry));
  71. }
  72. /// <summary>
  73. /// 保存多个key value
  74. /// </summary>
  75. /// <param name="keyValues">键值对</param>
  76. /// <returns>是否保存成功</returns>
  77. public bool SetString(List<KeyValuePair<RedisKey, RedisValue>> keyValues)
  78. {
  79. List<KeyValuePair<RedisKey, RedisValue>> newkeyValues =
  80. keyValues.Select(p => new KeyValuePair<RedisKey, RedisValue>(AddSysCustomKey(p.Key), p.Value)).ToList();
  81. return Do(db => db.StringSet(newkeyValues.ToArray()));
  82. }
  83. /// <summary>
  84. /// 保存一个对象
  85. /// </summary>
  86. /// <typeparam name="T">对象类型</typeparam>
  87. /// <param name="key">键</param>
  88. /// <param name="obj">值</param>
  89. /// <param name="expiry">过期时间</param>
  90. /// <returns>是否保存成功</returns>
  91. public bool SetString<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
  92. {
  93. key = AddSysCustomKey(key);
  94. string json = ConvertJson(obj);
  95. return Do(db => db.StringSet(key, json, expiry));
  96. }
  97. /// <summary>
  98. /// 获取单个key的值
  99. /// </summary>
  100. /// <param name="key">键</param>
  101. /// <returns>值</returns>
  102. public string GetString(string key)
  103. {
  104. key = AddSysCustomKey(key);
  105. return Do(db => db.StringGet(key));
  106. }
  107. /// <summary>
  108. /// 获取多个Key
  109. /// </summary>
  110. /// <param name="listKey">键集合</param>
  111. /// <returns>值集合</returns>
  112. public RedisValue[] GetString(List<string> listKey)
  113. {
  114. List<string> newKeys = listKey.Select(AddSysCustomKey).ToList();
  115. return Do(db => db.StringGet(ConvertRedisKeys(newKeys)));
  116. }
  117. /// <summary>
  118. /// 获取一个key的对象
  119. /// </summary>
  120. /// <typeparam name="T">数据类型</typeparam>
  121. /// <param name="key">键</param>
  122. /// <returns>实例对象</returns>
  123. public T GetString<T>(string key)
  124. {
  125. key = AddSysCustomKey(key);
  126. return Do(db => ConvertObj<T>(db.StringGet(key)));
  127. }
  128. /// <summary>
  129. /// 为数字增长val
  130. /// </summary>
  131. /// <param name="key">键</param>
  132. /// <param name="val">可以为负</param>
  133. /// <returns>增长后的值</returns>
  134. public double StringIncrement(string key, double val = 1)
  135. {
  136. key = AddSysCustomKey(key);
  137. return Do(db => db.StringIncrement(key, val));
  138. }
  139. /// <summary>
  140. /// 为数字减少val
  141. /// </summary>
  142. /// <param name="key">键</param>
  143. /// <param name="val">可以为负</param>
  144. /// <returns>减少后的值</returns>
  145. public double StringDecrement(string key, double val = 1)
  146. {
  147. key = AddSysCustomKey(key);
  148. return Do(db => db.StringDecrement(key, val));
  149. }
  150. #endregion 同步方法
  151. #region 异步方法
  152. /// <summary>
  153. /// 保存单个key value
  154. /// </summary>
  155. /// <param name="key">Redis Key</param>
  156. /// <param name="value">保存的值</param>
  157. /// <param name="expiry">过期时间</param>
  158. /// <returns>是否保存成功</returns>
  159. public async Task<bool> SetStringAsync(string key, string value, TimeSpan? expiry = default(TimeSpan?))
  160. {
  161. key = AddSysCustomKey(key);
  162. return await Do(db => db.StringSetAsync(key, value, expiry));
  163. }
  164. /// <summary>
  165. /// 保存多个key value
  166. /// </summary>
  167. /// <param name="keyValues">键值对</param>
  168. /// <returns>是否保存成功</returns>
  169. public async Task<bool> SetStringAsync(List<KeyValuePair<RedisKey, RedisValue>> keyValues)
  170. {
  171. List<KeyValuePair<RedisKey, RedisValue>> newkeyValues =
  172. keyValues.Select(p => new KeyValuePair<RedisKey, RedisValue>(AddSysCustomKey(p.Key), p.Value)).ToList();
  173. return await Do(db => db.StringSetAsync(newkeyValues.ToArray()));
  174. }
  175. /// <summary>
  176. /// 保存一个对象
  177. /// </summary>
  178. /// <typeparam name="T">数据类型</typeparam>
  179. /// <param name="key">键</param>
  180. /// <param name="obj">需要被缓存的对象</param>
  181. /// <param name="expiry">过期时间</param>
  182. /// <returns>是否保存成功</returns>
  183. public async Task<bool> SetStringAsync<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
  184. {
  185. key = AddSysCustomKey(key);
  186. string json = ConvertJson(obj);
  187. return await Do(db => db.StringSetAsync(key, json, expiry));
  188. }
  189. /// <summary>
  190. /// 获取单个key的值
  191. /// </summary>
  192. /// <param name="key">键</param>
  193. /// <returns>值</returns>
  194. public async Task<string> GetStringAsync(string key)
  195. {
  196. key = AddSysCustomKey(key);
  197. return await Do(db => db.StringGetAsync(key));
  198. }
  199. /// <summary>
  200. /// 获取多个Key
  201. /// </summary>
  202. /// <param name="listKey">键集合</param>
  203. /// <returns>值集合</returns>
  204. public Task<RedisValue[]> GetStringAsync(List<string> listKey)
  205. {
  206. List<string> newKeys = listKey.Select(AddSysCustomKey).ToList();
  207. return Do(db => db.StringGetAsync(ConvertRedisKeys(newKeys)));
  208. }
  209. /// <summary>
  210. /// 获取一个key的对象
  211. /// </summary>
  212. /// <typeparam name="T">数据类型</typeparam>
  213. /// <param name="key">键</param>
  214. /// <returns>实例对象</returns>
  215. public async Task<T> GetStringAsync<T>(string key)
  216. {
  217. key = AddSysCustomKey(key);
  218. string result = await Do(db => db.StringGetAsync(key));
  219. return ConvertObj<T>(result);
  220. }
  221. /// <summary>
  222. /// 为数字增长val
  223. /// </summary>
  224. /// <param name="key">键</param>
  225. /// <param name="val">可以为负</param>
  226. /// <returns>增长后的值</returns>
  227. public Task<double> IncrementStringAsync(string key, double val = 1)
  228. {
  229. key = AddSysCustomKey(key);
  230. return Do(db => db.StringIncrementAsync(key, val));
  231. }
  232. /// <summary>
  233. /// 为数字减少val
  234. /// </summary>
  235. /// <param name="key">键</param>
  236. /// <param name="val">可以为负</param>
  237. /// <returns>减少后的值</returns>
  238. public Task<double> DecrementStringAsync(string key, double val = 1)
  239. {
  240. key = AddSysCustomKey(key);
  241. return Do(db => db.StringDecrementAsync(key, val));
  242. }
  243. #endregion 异步方法
  244. #endregion String
  245. #region Hash
  246. #region 同步方法
  247. /// <summary>
  248. /// 判断某个数据是否已经被缓存
  249. /// </summary>
  250. /// <param name="key">键</param>
  251. /// <param name="dataKey">对象的字段</param>
  252. /// <returns>是否缓存成功</returns>
  253. public bool HashExists(string key, string dataKey)
  254. {
  255. key = AddSysCustomKey(key);
  256. return Do(db => db.HashExists(key, dataKey));
  257. }
  258. /// <summary>
  259. /// 存储数据到hash表
  260. /// </summary>
  261. /// <typeparam name="T">数据类型</typeparam>
  262. /// <param name="key">键</param>
  263. /// <param name="dataKey">对象的字段</param>
  264. /// <param name="t">对象实例</param>
  265. /// <returns>是否存储成功</returns>
  266. public bool SetHash<T>(string key, string dataKey, T t)
  267. {
  268. key = AddSysCustomKey(key);
  269. return Do(db =>
  270. {
  271. string json = ConvertJson(t);
  272. return db.HashSet(key, dataKey, json);
  273. });
  274. }
  275. /// <summary>
  276. /// 移除hash中的某值
  277. /// </summary>
  278. /// <param name="key">键</param>
  279. /// <param name="dataKey">对象的字段</param>
  280. /// <returns>是否移除成功</returns>
  281. public bool DeleteHash(string key, string dataKey)
  282. {
  283. key = AddSysCustomKey(key);
  284. return Do(db => db.HashDelete(key, dataKey));
  285. }
  286. /// <summary>
  287. /// 移除hash中的多个值
  288. /// </summary>
  289. /// <param name="key">键</param>
  290. /// <param name="dataKeys">对象的字段集合</param>
  291. /// <returns>数量</returns>
  292. public long DeleteHash(string key, List<RedisValue> dataKeys)
  293. {
  294. key = AddSysCustomKey(key);
  295. //List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"};
  296. return Do(db => db.HashDelete(key, dataKeys.ToArray()));
  297. }
  298. /// <summary>
  299. /// 从hash表获取数据
  300. /// </summary>
  301. /// <typeparam name="T">数据类型</typeparam>
  302. /// <param name="key">键</param>
  303. /// <param name="dataKey">对象的字段</param>
  304. /// <returns>对象实例</returns>
  305. public T GetHash<T>(string key, string dataKey)
  306. {
  307. key = AddSysCustomKey(key);
  308. return Do(db =>
  309. {
  310. string value = db.HashGet(key, dataKey);
  311. return ConvertObj<T>(value);
  312. });
  313. }
  314. /// <summary>
  315. /// 为数字增长val
  316. /// </summary>
  317. /// <param name="key">键</param>
  318. /// <param name="dataKey">对象的字段</param>
  319. /// <param name="val">可以为负</param>
  320. /// <returns>增长后的值</returns>
  321. public double IncrementHash(string key, string dataKey, double val = 1)
  322. {
  323. key = AddSysCustomKey(key);
  324. return Do(db => db.HashIncrement(key, dataKey, val));
  325. }
  326. /// <summary>
  327. /// 为数字减少val
  328. /// </summary>
  329. /// <param name="key">键</param>
  330. /// <param name="dataKey">对象的字段</param>
  331. /// <param name="val">可以为负</param>
  332. /// <returns>减少后的值</returns>
  333. public double DecrementHash(string key, string dataKey, double val = 1)
  334. {
  335. key = AddSysCustomKey(key);
  336. return Do(db => db.HashDecrement(key, dataKey, val));
  337. }
  338. /// <summary>
  339. /// 获取hashkey所有Redis key
  340. /// </summary>
  341. /// <typeparam name="T">数据类型</typeparam>
  342. /// <param name="key">键</param>
  343. /// <returns>数据集合</returns>
  344. public List<T> HashKeys<T>(string key)
  345. {
  346. key = AddSysCustomKey(key);
  347. return Do(db =>
  348. {
  349. RedisValue[] values = db.HashKeys(key);
  350. return ConvetList<T>(values);
  351. });
  352. }
  353. #endregion 同步方法
  354. #region 异步方法
  355. /// <summary>
  356. /// 判断某个数据是否已经被缓存
  357. /// </summary>
  358. /// <param name="key">键</param>
  359. /// <param name="dataKey">对象的字段</param>
  360. /// <returns>是否缓存成功</returns>
  361. public Task<bool> ExistsHashAsync(string key, string dataKey)
  362. {
  363. key = AddSysCustomKey(key);
  364. return Do(db => db.HashExistsAsync(key, dataKey));
  365. }
  366. /// <summary>
  367. /// 存储数据到hash表
  368. /// </summary>
  369. /// <typeparam name="T">数据类型</typeparam>
  370. /// <param name="key">键</param>
  371. /// <param name="dataKey">对象的字段</param>
  372. /// <param name="t">对象实例</param>
  373. /// <returns>是否存储成功</returns>
  374. public Task<bool> SetHashAsync<T>(string key, string dataKey, T t)
  375. {
  376. key = AddSysCustomKey(key);
  377. return Do(db =>
  378. {
  379. string json = ConvertJson(t);
  380. return db.HashSetAsync(key, dataKey, json);
  381. });
  382. }
  383. /// <summary>
  384. /// 移除hash中的某值
  385. /// </summary>
  386. /// <param name="key">键</param>
  387. /// <param name="dataKey">对象的字段</param>
  388. /// <returns>是否移除成功</returns>
  389. public Task<bool> DeleteHashAsync(string key, string dataKey)
  390. {
  391. key = AddSysCustomKey(key);
  392. return Do(db => db.HashDeleteAsync(key, dataKey));
  393. }
  394. /// <summary>
  395. /// 移除hash中的多个值
  396. /// </summary>
  397. /// <param name="key">键</param>
  398. /// <param name="dataKeys">对象的字段集合</param>
  399. /// <returns>数量</returns>
  400. public Task<long> DeleteHashAsync(string key, List<RedisValue> dataKeys)
  401. {
  402. key = AddSysCustomKey(key);
  403. return Do(db => db.HashDeleteAsync(key, dataKeys.ToArray()));
  404. }
  405. /// <summary>
  406. /// 从hash表获取数据
  407. /// </summary>
  408. /// <typeparam name="T">数据类型</typeparam>
  409. /// <param name="key">键</param>
  410. /// <param name="dataKey">对象的字段</param>
  411. /// <returns>对象实例</returns>
  412. public async Task<T> GetHashAsync<T>(string key, string dataKey)
  413. {
  414. key = AddSysCustomKey(key);
  415. string value = await Do(db => db.HashGetAsync(key, dataKey));
  416. return ConvertObj<T>(value);
  417. }
  418. /// <summary>
  419. /// 为数字增长val
  420. /// </summary>
  421. /// <param name="key">键</param>
  422. /// <param name="dataKey">对象的字段</param>
  423. /// <param name="val">可以为负</param>
  424. /// <returns>增长后的值</returns>
  425. public Task<double> IncrementHashAsync(string key, string dataKey, double val = 1)
  426. {
  427. key = AddSysCustomKey(key);
  428. return Do(db => db.HashIncrementAsync(key, dataKey, val));
  429. }
  430. /// <summary>
  431. /// 为数字减少val
  432. /// </summary>
  433. /// <param name="key">键</param>
  434. /// <param name="dataKey">对象的字段</param>
  435. /// <param name="val">可以为负</param>
  436. /// <returns>减少后的值</returns>
  437. public Task<double> DecrementHashAsync(string key, string dataKey, double val = 1)
  438. {
  439. key = AddSysCustomKey(key);
  440. return Do(db => db.HashDecrementAsync(key, dataKey, val));
  441. }
  442. /// <summary>
  443. /// 获取hashkey所有Redis key
  444. /// </summary>
  445. /// <typeparam name="T">数据类型</typeparam>
  446. /// <param name="key">键</param>
  447. /// <returns>数据集合</returns>
  448. public async Task<List<T>> HashKeysAsync<T>(string key)
  449. {
  450. key = AddSysCustomKey(key);
  451. RedisValue[] values = await Do(db => db.HashKeysAsync(key));
  452. return ConvetList<T>(values);
  453. }
  454. #endregion 异步方法
  455. #endregion Hash
  456. #region List
  457. #region 同步方法
  458. /// <summary>
  459. /// 移除指定ListId的内部List的值
  460. /// </summary>
  461. /// <typeparam name="T">数据类型</typeparam>
  462. /// <param name="key">键</param>
  463. /// <param name="value">值</param>
  464. public void RemoveList<T>(string key, T value)
  465. {
  466. key = AddSysCustomKey(key);
  467. Do(db => db.ListRemove(key, ConvertJson(value)));
  468. }
  469. /// <summary>
  470. /// 获取指定key的List
  471. /// </summary>
  472. /// <typeparam name="T">数据类型</typeparam>
  473. /// <param name="key">键</param>
  474. /// <returns>数据集</returns>
  475. public List<T> ListRange<T>(string key)
  476. {
  477. key = AddSysCustomKey(key);
  478. return Do(redis =>
  479. {
  480. var values = redis.ListRange(key);
  481. return ConvetList<T>(values);
  482. });
  483. }
  484. /// <summary>
  485. /// 入队
  486. /// </summary>
  487. /// <typeparam name="T">数据类型</typeparam>
  488. /// <param name="key">键</param>
  489. /// <param name="value">值</param>
  490. public void ListRightPush<T>(string key, T value)
  491. {
  492. key = AddSysCustomKey(key);
  493. Do(db => db.ListRightPush(key, ConvertJson(value)));
  494. }
  495. /// <summary>
  496. /// 出队
  497. /// </summary>
  498. /// <typeparam name="T">数据类型</typeparam>
  499. /// <param name="key">键</param>
  500. /// <returns>值</returns>
  501. public T ListRightPop<T>(string key)
  502. {
  503. key = AddSysCustomKey(key);
  504. return Do(db =>
  505. {
  506. var value = db.ListRightPop(key);
  507. return ConvertObj<T>(value);
  508. });
  509. }
  510. /// <summary>
  511. /// 入栈
  512. /// </summary>
  513. /// <typeparam name="T">数据类型</typeparam>
  514. /// <param name="key">键</param>
  515. /// <param name="value">值</param>
  516. public void ListLeftPush<T>(string key, T value)
  517. {
  518. key = AddSysCustomKey(key);
  519. Do(db => db.ListLeftPush(key, ConvertJson(value)));
  520. }
  521. /// <summary>
  522. /// 出栈
  523. /// </summary>
  524. /// <typeparam name="T">数据类型</typeparam>
  525. /// <param name="key">键</param>
  526. /// <returns>对象实例</returns>
  527. public T ListLeftPop<T>(string key)
  528. {
  529. key = AddSysCustomKey(key);
  530. return Do(db =>
  531. {
  532. var value = db.ListLeftPop(key);
  533. return ConvertObj<T>(value);
  534. });
  535. }
  536. /// <summary>
  537. /// 获取集合中的数量
  538. /// </summary>
  539. /// <param name="key">键</param>
  540. /// <returns>数量</returns>
  541. public long ListLength(string key)
  542. {
  543. key = AddSysCustomKey(key);
  544. return Do(redis => redis.ListLength(key));
  545. }
  546. #endregion 同步方法
  547. #region 异步方法
  548. /// <summary>
  549. /// 移除指定ListId的内部List的值
  550. /// </summary>
  551. /// <param name="key">键</param>
  552. /// <param name="value">值</param>
  553. public Task<long> RemoveListAsync<T>(string key, T value)
  554. {
  555. key = AddSysCustomKey(key);
  556. return Do(db => db.ListRemoveAsync(key, ConvertJson(value)));
  557. }
  558. /// <summary>
  559. /// 获取指定key的List
  560. /// </summary>
  561. /// <typeparam name="T">数据类型</typeparam>
  562. /// <param name="key">键</param>
  563. /// <returns>数据集合</returns>
  564. public async Task<List<T>> ListRangeAsync<T>(string key)
  565. {
  566. key = AddSysCustomKey(key);
  567. var values = await Do(redis => redis.ListRangeAsync(key));
  568. return ConvetList<T>(values);
  569. }
  570. /// <summary>
  571. /// 入队
  572. /// </summary>
  573. /// <typeparam name="T">数据类型</typeparam>
  574. /// <param name="key">键</param>
  575. /// <param name="value">值</param>
  576. public async Task<long> ListRightPushAsync<T>(string key, T value)
  577. {
  578. key = AddSysCustomKey(key);
  579. return await Do(db => db.ListRightPushAsync(key, ConvertJson(value)));
  580. }
  581. /// <summary>
  582. /// 出队
  583. /// </summary>
  584. /// <typeparam name="T">数据类型</typeparam>
  585. /// <param name="key">键</param>
  586. /// <returns>对象实例</returns>
  587. public async Task<T> ListRightPopAsync<T>(string key)
  588. {
  589. key = AddSysCustomKey(key);
  590. var value = await Do(db => db.ListRightPopAsync(key));
  591. return ConvertObj<T>(value);
  592. }
  593. /// <summary>
  594. /// 入栈
  595. /// </summary>
  596. /// <typeparam name="T">数据类型</typeparam>
  597. /// <param name="key">键</param>
  598. /// <param name="value">值</param>
  599. public async Task<long> ListLeftPushAsync<T>(string key, T value)
  600. {
  601. key = AddSysCustomKey(key);
  602. return await Do(db => db.ListLeftPushAsync(key, ConvertJson(value)));
  603. }
  604. /// <summary>
  605. /// 出栈
  606. /// </summary>
  607. /// <typeparam name="T">数据类型</typeparam>
  608. /// <param name="key">键</param>
  609. /// <returns>实例对象</returns>
  610. public async Task<T> ListLeftPopAsync<T>(string key)
  611. {
  612. key = AddSysCustomKey(key);
  613. var value = await Do(db => db.ListLeftPopAsync(key));
  614. return ConvertObj<T>(value);
  615. }
  616. /// <summary>
  617. /// 获取集合中的数量
  618. /// </summary>
  619. /// <param name="key">键</param>
  620. /// <returns>数量</returns>
  621. public async Task<long> ListLengthAsync(string key)
  622. {
  623. key = AddSysCustomKey(key);
  624. return await Do(redis => redis.ListLengthAsync(key));
  625. }
  626. #endregion 异步方法
  627. #endregion List
  628. #region SortedSet 有序集合
  629. #region 同步方法
  630. /// <summary>
  631. /// 添加
  632. /// </summary>
  633. /// <param name="key">键</param>
  634. /// <param name="value">值</param>
  635. /// <param name="score">排序号</param>
  636. public bool AddSortedSet<T>(string key, T value, double score)
  637. {
  638. key = AddSysCustomKey(key);
  639. return Do(redis => redis.SortedSetAdd(key, ConvertJson<T>(value), score));
  640. }
  641. /// <summary>
  642. /// 删除
  643. /// </summary>
  644. /// <param name="key">键</param>
  645. /// <param name="value">值</param>
  646. public bool RemoveSortedSet<T>(string key, T value)
  647. {
  648. key = AddSysCustomKey(key);
  649. return Do(redis => redis.SortedSetRemove(key, ConvertJson(value)));
  650. }
  651. /// <summary>
  652. /// 获取全部
  653. /// </summary>
  654. /// <param name="key">键</param>
  655. /// <returns>数据集合</returns>
  656. public List<T> SetRangeSortedByRank<T>(string key)
  657. {
  658. key = AddSysCustomKey(key);
  659. return Do(redis =>
  660. {
  661. var values = redis.SortedSetRangeByRank(key);
  662. return ConvetList<T>(values);
  663. });
  664. }
  665. /// <summary>
  666. /// 获取集合中的数量
  667. /// </summary>
  668. /// <param name="key">键</param>
  669. /// <returns>数量</returns>
  670. public long SetSortedLength(string key)
  671. {
  672. key = AddSysCustomKey(key);
  673. return Do(redis => redis.SortedSetLength(key));
  674. }
  675. #endregion 同步方法
  676. #region 异步方法
  677. /// <summary>
  678. /// 添加
  679. /// </summary>
  680. /// <param name="key">键</param>
  681. /// <param name="value">值</param>
  682. /// <param name="score">排序号</param>
  683. public async Task<bool> SortedSetAddAsync<T>(string key, T value, double score)
  684. {
  685. key = AddSysCustomKey(key);
  686. return await Do(redis => redis.SortedSetAddAsync(key, ConvertJson<T>(value), score));
  687. }
  688. /// <summary>
  689. /// 删除
  690. /// </summary>
  691. /// <param name="key">键</param>
  692. /// <param name="value">值</param>
  693. public async Task<bool> SortedSetRemoveAsync<T>(string key, T value)
  694. {
  695. key = AddSysCustomKey(key);
  696. return await Do(redis => redis.SortedSetRemoveAsync(key, ConvertJson(value)));
  697. }
  698. /// <summary>
  699. /// 获取全部
  700. /// </summary>
  701. /// <param name="key">键</param>
  702. /// <returns>数据集合</returns>
  703. public async Task<List<T>> SortedSetRangeByRankAsync<T>(string key)
  704. {
  705. key = AddSysCustomKey(key);
  706. var values = await Do(redis => redis.SortedSetRangeByRankAsync(key));
  707. return ConvetList<T>(values);
  708. }
  709. /// <summary>
  710. /// 获取集合中的数量
  711. /// </summary>
  712. /// <param name="key">键</param>
  713. /// <returns>数量</returns>
  714. public async Task<long> SortedSetLengthAsync(string key)
  715. {
  716. key = AddSysCustomKey(key);
  717. return await Do(redis => redis.SortedSetLengthAsync(key));
  718. }
  719. #endregion 异步方法
  720. #endregion SortedSet 有序集合
  721. #region key
  722. /// <summary>
  723. /// 删除单个key
  724. /// </summary>
  725. /// <param name="key">redis key</param>
  726. /// <returns>是否删除成功</returns>
  727. public bool DeleteKey(string key)
  728. {
  729. key = AddSysCustomKey(key);
  730. return Do(db => db.KeyDelete(key));
  731. }
  732. /// <summary>
  733. /// 删除多个key
  734. /// </summary>
  735. /// <param name="keys">rediskey</param>
  736. /// <returns>成功删除的个数</returns>
  737. public long DeleteKey(List<string> keys)
  738. {
  739. List<string> newKeys = keys.Select(AddSysCustomKey).ToList();
  740. return Do(db => db.KeyDelete(ConvertRedisKeys(newKeys)));
  741. }
  742. /// <summary>
  743. /// 判断key是否存储
  744. /// </summary>
  745. /// <param name="key">键</param>
  746. /// <returns>是否存储成功</returns>
  747. public bool KeyExists(string key)
  748. {
  749. key = AddSysCustomKey(key);
  750. return Do(db => db.KeyExists(key));
  751. }
  752. /// <summary>
  753. /// 重新命名key
  754. /// </summary>
  755. /// <param name="key">旧的键</param>
  756. /// <param name="newKey">新的键</param>
  757. /// <returns>处理结果</returns>
  758. public bool RenameKey(string key, string newKey)
  759. {
  760. key = AddSysCustomKey(key);
  761. return Do(db => db.KeyRename(key, newKey));
  762. }
  763. /// <summary>
  764. /// 设置Key的过期时间
  765. /// </summary>
  766. /// <param name="key">键</param>
  767. /// <param name="expiry">过期时间</param>
  768. /// <returns>处理结果</returns>
  769. public bool Expire(string key, TimeSpan? expiry = default(TimeSpan?))
  770. {
  771. key = AddSysCustomKey(key);
  772. return Do(db => db.KeyExpire(key, expiry));
  773. }
  774. #endregion key
  775. #region 发布订阅
  776. /// <summary>
  777. /// Redis发布订阅 订阅
  778. /// </summary>
  779. /// <param name="subChannel">订阅频道</param>
  780. /// <param name="handler">处理过程</param>
  781. public void Subscribe(string subChannel, Action<RedisChannel, RedisValue> handler = null)
  782. {
  783. ISubscriber sub = _conn.GetSubscriber();
  784. sub.Subscribe(subChannel, (channel, message) =>
  785. {
  786. if (handler == null)
  787. {
  788. Console.WriteLine(subChannel + " 订阅收到消息:" + message);
  789. }
  790. else
  791. {
  792. handler(channel, message);
  793. }
  794. });
  795. }
  796. /// <summary>
  797. /// Redis发布订阅 发布
  798. /// </summary>
  799. /// <typeparam name="T">消息对象</typeparam>
  800. /// <param name="channel">发布频道</param>
  801. /// <param name="msg">消息</param>
  802. /// <returns>消息的数量</returns>
  803. public long Publish<T>(string channel, T msg)
  804. {
  805. ISubscriber sub = _conn.GetSubscriber();
  806. return sub.Publish(channel, ConvertJson(msg));
  807. }
  808. /// <summary>
  809. /// Redis发布订阅 取消订阅
  810. /// </summary>
  811. /// <param name="channel">频道</param>
  812. public void Unsubscribe(string channel)
  813. {
  814. ISubscriber sub = _conn.GetSubscriber();
  815. sub.Unsubscribe(channel);
  816. }
  817. /// <summary>
  818. /// Redis发布订阅 取消全部订阅
  819. /// </summary>
  820. public void UnsubscribeAll()
  821. {
  822. ISubscriber sub = _conn.GetSubscriber();
  823. sub.UnsubscribeAll();
  824. }
  825. #endregion 发布订阅
  826. #region 其他
  827. /// <summary>
  828. /// 创建一个事务
  829. /// </summary>
  830. /// <returns>事务对象</returns>
  831. public ITransaction CreateTransaction()
  832. {
  833. return GetDatabase().CreateTransaction();
  834. }
  835. /// <summary>
  836. /// 获得一个数据库实例
  837. /// </summary>
  838. /// <returns>数据库实例</returns>
  839. public IDatabase GetDatabase()
  840. {
  841. return _conn.GetDatabase(DbNum);
  842. }
  843. /// <summary>
  844. /// 获得一个服务器实例
  845. /// </summary>
  846. /// <param name="hostAndPort">服务器地址</param>
  847. /// <returns>服务器实例</returns>
  848. public IServer GetServer(string hostAndPort)
  849. {
  850. return _conn.GetServer(hostAndPort);
  851. }
  852. /// <summary>
  853. /// 设置前缀
  854. /// </summary>
  855. /// <param name="customKey">前缀</param>
  856. public void SetSysCustomKey(string customKey)
  857. {
  858. CustomKey = customKey;
  859. }
  860. #endregion 其他
  861. #region 辅助方法
  862. private string AddSysCustomKey(string oldKey)
  863. {
  864. var prefixKey = CustomKey ?? String.Empty;
  865. return prefixKey + oldKey;
  866. }
  867. private T Do<T>(Func<IDatabase, T> func)
  868. {
  869. var database = _conn.GetDatabase(DbNum);
  870. return func(database);
  871. }
  872. private string ConvertJson<T>(T value)
  873. {
  874. return JsonConvert.SerializeObject(value);
  875. }
  876. private T ConvertObj<T>(RedisValue value)
  877. {
  878. return JsonConvert.DeserializeObject<T>(value);
  879. }
  880. private List<T> ConvetList<T>(RedisValue[] values)
  881. {
  882. List<T> result = new List<T>();
  883. foreach (var item in values)
  884. {
  885. var model = ConvertObj<T>(item);
  886. result.Add(model);
  887. }
  888. return result;
  889. }
  890. private RedisKey[] ConvertRedisKeys(List<string> redisKeys)
  891. {
  892. return redisKeys.Select(redisKey => (RedisKey)redisKey).ToArray();
  893. }
  894. #endregion 辅助方法
  895. }
  896. }