RedisHelp.cs 30 KB

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