RedisHelp.cs 30 KB

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