RedisHelper.cs 32 KB

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