RedisUtil.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  1. package com.genersoft.iot.vmp.utils.redis;
  2. import java.util.*;
  3. import java.util.concurrent.TimeUnit;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.genersoft.iot.vmp.utils.SpringBeanFactory;
  6. import gov.nist.javax.sip.stack.UDPMessageChannel;
  7. import org.springframework.data.redis.core.*;
  8. import org.springframework.util.CollectionUtils;
  9. /**
  10. * Redis工具类
  11. * @author swwheihei
  12. * @date 2020年5月6日 下午8:27:29
  13. */
  14. @SuppressWarnings(value = {"rawtypes", "unchecked"})
  15. public class RedisUtil {
  16. private static RedisTemplate redisTemplate;
  17. static {
  18. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  19. }
  20. /**
  21. * 指定缓存失效时间
  22. * @param key 键
  23. * @param time 时间(秒)
  24. * @return true / false
  25. */
  26. public static boolean expire(String key, long time) {
  27. if (redisTemplate == null) {
  28. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  29. }
  30. try {
  31. if (time > 0) {
  32. redisTemplate.expire(key, time, TimeUnit.SECONDS);
  33. }
  34. return true;
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. return false;
  38. }
  39. }
  40. /**
  41. * 根据 key 获取过期时间
  42. * @param key 键
  43. */
  44. public static long getExpire(String key) {
  45. if (redisTemplate == null) {
  46. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  47. }
  48. return redisTemplate.getExpire(key, TimeUnit.SECONDS);
  49. }
  50. /**
  51. * 判断 key 是否存在
  52. * @param key 键
  53. * @return true / false
  54. */
  55. public static boolean hasKey(String key) {
  56. if (redisTemplate == null) {
  57. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  58. }
  59. try {
  60. return redisTemplate.hasKey(key);
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. return false;
  64. }
  65. }
  66. /**
  67. * 删除缓存
  68. * @SuppressWarnings("unchecked") 忽略类型转换警告
  69. * @param key 键(一个或者多个)
  70. */
  71. public static boolean del(String... key) {
  72. if (redisTemplate == null) {
  73. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  74. }
  75. try {
  76. if (key != null && key.length > 0) {
  77. if (key.length == 1) {
  78. redisTemplate.delete(key[0]);
  79. } else {
  80. // 传入一个 Collection<String> 集合
  81. redisTemplate.delete(CollectionUtils.arrayToList(key));
  82. }
  83. }
  84. return true;
  85. } catch (Exception e) {
  86. e.printStackTrace();
  87. return false;
  88. }
  89. }
  90. // ============================== String ==============================
  91. /**
  92. * 普通缓存获取
  93. * @param key 键
  94. * @return 值
  95. */
  96. public static Object get(String key) {
  97. if (redisTemplate == null) {
  98. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  99. }
  100. return key == null ? null : redisTemplate.opsForValue().get(key);
  101. }
  102. /**
  103. * 普通缓存放入
  104. * @param key 键
  105. * @param value 值
  106. * @return true / false
  107. */
  108. public static boolean set(String key, Object value) {
  109. if (redisTemplate == null) {
  110. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  111. }
  112. try {
  113. redisTemplate.opsForValue().set(key, value);
  114. return true;
  115. } catch (Exception e) {
  116. e.printStackTrace();
  117. return false;
  118. }
  119. }
  120. /**
  121. * 普通缓存放入并设置时间
  122. * @param key 键
  123. * @param value 值
  124. * @param time 时间(秒),如果 time < 0 则设置无限时间
  125. * @return true / false
  126. */
  127. public static boolean set(String key, Object value, long time) {
  128. if (redisTemplate == null) {
  129. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  130. }
  131. try {
  132. if (time > 0) {
  133. redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
  134. } else {
  135. set(key, value);
  136. }
  137. return true;
  138. } catch (Exception e) {
  139. e.printStackTrace();
  140. return false;
  141. }
  142. }
  143. /**
  144. * 递增
  145. * @param key 键
  146. * @param delta 递增大小
  147. * @return
  148. */
  149. public static long incr(String key, long delta) {
  150. if (redisTemplate == null) {
  151. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  152. }
  153. if (delta < 0) {
  154. throw new RuntimeException("递增因子必须大于 0");
  155. }
  156. return redisTemplate.opsForValue().increment(key, delta);
  157. }
  158. /**
  159. * 递减
  160. * @param key 键
  161. * @param delta 递减大小
  162. * @return
  163. */
  164. public static long decr(String key, long delta) {
  165. if (redisTemplate == null) {
  166. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  167. }
  168. if (delta < 0) {
  169. throw new RuntimeException("递减因子必须大于 0");
  170. }
  171. return redisTemplate.opsForValue().increment(key, delta);
  172. }
  173. // ============================== Map ==============================
  174. /**
  175. * HashGet
  176. * @param key 键(no null)
  177. * @param item 项(no null)
  178. * @return 值
  179. */
  180. public static Object hget(String key, String item) {
  181. if (redisTemplate == null) {
  182. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  183. }
  184. return redisTemplate.opsForHash().get(key, item);
  185. }
  186. /**
  187. * 获取 key 对应的 map
  188. * @param key 键(no null)
  189. * @return 对应的多个键值
  190. */
  191. public static Map<Object, Object> hmget(String key) {
  192. if (redisTemplate == null) {
  193. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  194. }
  195. return redisTemplate.opsForHash().entries(key);
  196. }
  197. /**
  198. * HashSet
  199. * @param key 键
  200. * @param map 值
  201. * @return true / false
  202. */
  203. public static boolean hmset(String key, Map<Object, Object> map) {
  204. if (redisTemplate == null) {
  205. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  206. }
  207. try {
  208. redisTemplate.opsForHash().putAll(key, map);
  209. return true;
  210. } catch (Exception e) {
  211. e.printStackTrace();
  212. return false;
  213. }
  214. }
  215. /**
  216. * HashSet 并设置时间
  217. * @param key 键
  218. * @param map 值
  219. * @param time 时间
  220. * @return true / false
  221. */
  222. public static boolean hmset(String key, Map<Object, Object> map, long time) {
  223. if (redisTemplate == null) {
  224. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  225. }
  226. try {
  227. redisTemplate.opsForHash().putAll(key, map);
  228. if (time > 0) {
  229. expire(key, time);
  230. }
  231. return true;
  232. } catch (Exception e) {
  233. e.printStackTrace();
  234. return false;
  235. }
  236. }
  237. /**
  238. * 向一张 Hash表 中放入数据,如不存在则创建
  239. * @param key 键
  240. * @param item 项
  241. * @param value 值
  242. * @return true / false
  243. */
  244. public static boolean hset(String key, String item, Object value) {
  245. if (redisTemplate == null) {
  246. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  247. }
  248. try {
  249. redisTemplate.opsForHash().put(key, item, value);
  250. return true;
  251. } catch (Exception e) {
  252. e.printStackTrace();
  253. return false;
  254. }
  255. }
  256. /**
  257. * 向一张 Hash表 中放入数据,并设置时间,如不存在则创建
  258. * @param key 键
  259. * @param item 项
  260. * @param value 值
  261. * @param time 时间(如果原来的 Hash表 设置了时间,这里会覆盖)
  262. * @return true / false
  263. */
  264. public static boolean hset(String key, String item, Object value, long time) {
  265. if (redisTemplate == null) {
  266. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  267. }
  268. try {
  269. redisTemplate.opsForHash().put(key, item, value);
  270. if (time > 0) {
  271. expire(key, time);
  272. }
  273. return true;
  274. } catch (Exception e) {
  275. e.printStackTrace();
  276. return false;
  277. }
  278. }
  279. /**
  280. * 删除 Hash表 中的值
  281. * @param key 键
  282. * @param item 项(可以多个,no null)
  283. */
  284. public static void hdel(String key, Object... item) {
  285. if (redisTemplate == null) {
  286. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  287. }
  288. redisTemplate.opsForHash().delete(key, item);
  289. }
  290. /**
  291. * 判断 Hash表 中是否有该键的值
  292. * @param key 键(no null)
  293. * @param item 值(no null)
  294. * @return true / false
  295. */
  296. public static boolean hHasKey(String key, String item) {
  297. if (redisTemplate == null) {
  298. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  299. }
  300. return redisTemplate.opsForHash().hasKey(key, item);
  301. }
  302. /**
  303. * Hash递增,如果不存在则创建一个,并把新增的值返回
  304. * @param key 键
  305. * @param item 项
  306. * @param by 递增大小 > 0
  307. * @return
  308. */
  309. public static Double hincr(String key, String item, Double by) {
  310. if (redisTemplate == null) {
  311. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  312. }
  313. return redisTemplate.opsForHash().increment(key, item, by);
  314. }
  315. /**
  316. * Hash递减
  317. * @param key 键
  318. * @param item 项
  319. * @param by 递减大小
  320. * @return
  321. */
  322. public static Double hdecr(String key, String item, Double by) {
  323. if (redisTemplate == null) {
  324. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  325. }
  326. return redisTemplate.opsForHash().increment(key, item, -by);
  327. }
  328. // ============================== Set ==============================
  329. /**
  330. * 根据 key 获取 set 中的所有值
  331. * @param key 键
  332. * @return 值
  333. */
  334. public static Set<Object> sGet(String key) {
  335. if (redisTemplate == null) {
  336. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  337. }
  338. try {
  339. return redisTemplate.opsForSet().members(key);
  340. } catch (Exception e) {
  341. e.printStackTrace();
  342. return null;
  343. }
  344. }
  345. /**
  346. * 从键为 key 的 set 中,根据 value 查询是否存在
  347. * @param key 键
  348. * @param value 值
  349. * @return true / false
  350. */
  351. public static boolean sHasKey(String key, Object value) {
  352. if (redisTemplate == null) {
  353. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  354. }
  355. try {
  356. return redisTemplate.opsForSet().isMember(key, value);
  357. } catch (Exception e) {
  358. e.printStackTrace();
  359. return false;
  360. }
  361. }
  362. /**
  363. * 将数据放入 set缓存
  364. * @param key 键值
  365. * @param values 值(可以多个)
  366. * @return 成功个数
  367. */
  368. public static long sSet(String key, Object... values) {
  369. if (redisTemplate == null) {
  370. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  371. }
  372. try {
  373. return redisTemplate.opsForSet().add(key, values);
  374. } catch (Exception e) {
  375. e.printStackTrace();
  376. return 0;
  377. }
  378. }
  379. /**
  380. * 将数据放入 set缓存,并设置时间
  381. * @param key 键
  382. * @param time 时间
  383. * @param values 值(可以多个)
  384. * @return 成功放入个数
  385. */
  386. public static long sSet(String key, long time, Object... values) {
  387. if (redisTemplate == null) {
  388. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  389. }
  390. try {
  391. long count = redisTemplate.opsForSet().add(key, values);
  392. if (time > 0) {
  393. expire(key, time);
  394. }
  395. return count;
  396. } catch (Exception e) {
  397. e.printStackTrace();
  398. return 0;
  399. }
  400. }
  401. /**
  402. * 获取 set缓存的长度
  403. * @param key 键
  404. * @return 长度
  405. */
  406. public static long sGetSetSize(String key) {
  407. if (redisTemplate == null) {
  408. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  409. }
  410. try {
  411. return redisTemplate.opsForSet().size(key);
  412. } catch (Exception e) {
  413. e.printStackTrace();
  414. return 0;
  415. }
  416. }
  417. /**
  418. * 移除 set缓存中,值为 value 的
  419. * @param key 键
  420. * @param values 值
  421. * @return 成功移除个数
  422. */
  423. public static long setRemove(String key, Object... values) {
  424. if (redisTemplate == null) {
  425. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  426. }
  427. try {
  428. return redisTemplate.opsForSet().remove(key, values);
  429. } catch (Exception e) {
  430. e.printStackTrace();
  431. return 0;
  432. }
  433. }
  434. // ============================== ZSet ==============================
  435. /**
  436. * 添加一个元素, zset与set最大的区别就是每个元素都有一个score,因此有个排序的辅助功能; zadd
  437. *
  438. * @param key
  439. * @param value
  440. * @param score
  441. */
  442. public static void zAdd(Object key, Object value, double score) {
  443. if (redisTemplate == null) {
  444. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  445. }
  446. redisTemplate.opsForZSet().add(key, value, score);
  447. }
  448. /**
  449. * 删除元素 zrem
  450. *
  451. * @param key
  452. * @param value
  453. */
  454. public static void zRemove(Object key, Object value) {
  455. if (redisTemplate == null) {
  456. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  457. }
  458. redisTemplate.opsForZSet().remove(key, value);
  459. }
  460. /**
  461. * score的增加or减少 zincrby
  462. *
  463. * @param key
  464. * @param value
  465. * @param delta -1 表示减 1 表示加1
  466. */
  467. public static Double zIncrScore(Object key, Object value, double delta) {
  468. if (redisTemplate == null) {
  469. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  470. }
  471. return redisTemplate.opsForZSet().incrementScore(key, value, delta);
  472. }
  473. /**
  474. * 查询value对应的score zscore
  475. *
  476. * @param key
  477. * @param value
  478. * @return
  479. */
  480. public static Double zScore(Object key, Object value) {
  481. if (redisTemplate == null) {
  482. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  483. }
  484. return redisTemplate.opsForZSet().score(key, value);
  485. }
  486. /**
  487. * 判断value在zset中的排名 zrank
  488. *
  489. * @param key
  490. * @param value
  491. * @return
  492. */
  493. public static Long zRank(Object key, Object value) {
  494. if (redisTemplate == null) {
  495. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  496. }
  497. return redisTemplate.opsForZSet().rank(key, value);
  498. }
  499. /**
  500. * 返回集合的长度
  501. *
  502. * @param key
  503. * @return
  504. */
  505. public static Long zSize(Object key) {
  506. if (redisTemplate == null) {
  507. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  508. }
  509. return redisTemplate.opsForZSet().zCard(key);
  510. }
  511. /**
  512. * 查询集合中指定顺序的值, 0 -1 表示获取全部的集合内容 zrange
  513. *
  514. * 返回有序的集合,score小的在前面
  515. *
  516. * @param key
  517. * @param start
  518. * @param end
  519. * @return
  520. */
  521. public static Set<Object> zRange(Object key, int start, int end) {
  522. if (redisTemplate == null) {
  523. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  524. }
  525. return redisTemplate.opsForZSet().range(key, start, end);
  526. }
  527. /**
  528. * 查询集合中指定顺序的值和score,0, -1 表示获取全部的集合内容
  529. *
  530. * @param key
  531. * @param start
  532. * @param end
  533. * @return
  534. */
  535. public static Set<ZSetOperations.TypedTuple<String>> zRangeWithScore(Object key, int start, int end) {
  536. if (redisTemplate == null) {
  537. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  538. }
  539. return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
  540. }
  541. /**
  542. * 查询集合中指定顺序的值 zrevrange
  543. *
  544. * 返回有序的集合中,score大的在前面
  545. *
  546. * @param key
  547. * @param start
  548. * @param end
  549. * @return
  550. */
  551. public static Set<String> zRevRange(Object key, int start, int end) {
  552. if (redisTemplate == null) {
  553. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  554. }
  555. return redisTemplate.opsForZSet().reverseRange(key, start, end);
  556. }
  557. /**
  558. * 根据score的值,来获取满足条件的集合 zrangebyscore
  559. *
  560. * @param key
  561. * @param min
  562. * @param max
  563. * @return
  564. */
  565. public static Set<String> zSortRange(Object key, int min, int max) {
  566. if (redisTemplate == null) {
  567. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  568. }
  569. return redisTemplate.opsForZSet().rangeByScore(key, min, max);
  570. }
  571. // ============================== List ==============================
  572. /**
  573. * 获取 list缓存的内容
  574. * @param key 键
  575. * @param start 开始
  576. * @param end 结束(0 到 -1 代表所有值)
  577. * @return
  578. */
  579. public static List<Object> lGet(String key, long start, long end) {
  580. if (redisTemplate == null) {
  581. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  582. }
  583. try {
  584. return redisTemplate.opsForList().range(key, start, end);
  585. } catch (Exception e) {
  586. e.printStackTrace();
  587. return null;
  588. }
  589. }
  590. /**
  591. * 获取 list缓存的长度
  592. * @param key 键
  593. * @return 长度
  594. */
  595. public static long lGetListSize(String key) {
  596. if (redisTemplate == null) {
  597. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  598. }
  599. try {
  600. return redisTemplate.opsForList().size(key);
  601. } catch (Exception e) {
  602. e.printStackTrace();
  603. return 0;
  604. }
  605. }
  606. /**
  607. * 根据索引 index 获取键为 key 的 list 中的元素
  608. * @param key 键
  609. * @param index 索引
  610. * 当 index >= 0 时 {0:表头, 1:第二个元素}
  611. * 当 index < 0 时 {-1:表尾, -2:倒数第二个元素}
  612. * @return 值
  613. */
  614. public static Object lGetIndex(String key, long index) {
  615. if (redisTemplate == null) {
  616. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  617. }
  618. try {
  619. return redisTemplate.opsForList().index(key, index);
  620. } catch (Exception e) {
  621. e.printStackTrace();
  622. return null;
  623. }
  624. }
  625. /**
  626. * 将值 value 插入键为 key 的 list 中,如果 list 不存在则创建空 list
  627. * @param key 键
  628. * @param value 值
  629. * @return true / false
  630. */
  631. public static boolean lSet(String key, Object value) {
  632. if (redisTemplate == null) {
  633. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  634. }
  635. try {
  636. redisTemplate.opsForList().rightPush(key, value);
  637. return true;
  638. } catch (Exception e) {
  639. e.printStackTrace();
  640. return false;
  641. }
  642. }
  643. /**
  644. * 将值 value 插入键为 key 的 list 中,并设置时间
  645. * @param key 键
  646. * @param value 值
  647. * @param time 时间
  648. * @return true / false
  649. */
  650. public static boolean lSet(String key, Object value, long time) {
  651. if (redisTemplate == null) {
  652. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  653. }
  654. try {
  655. redisTemplate.opsForList().rightPush(key, value);
  656. if (time > 0) {
  657. expire(key, time);
  658. }
  659. return true;
  660. } catch (Exception e) {
  661. e.printStackTrace();
  662. return false;
  663. }
  664. }
  665. /**
  666. * 将 values 插入键为 key 的 list 中
  667. * @param key 键
  668. * @param values 值
  669. * @return true / false
  670. */
  671. public static boolean lSetList(String key, List<Object> values) {
  672. if (redisTemplate == null) {
  673. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  674. }
  675. try {
  676. redisTemplate.opsForList().rightPushAll(key, values);
  677. return true;
  678. } catch (Exception e) {
  679. e.printStackTrace();
  680. return false;
  681. }
  682. }
  683. /**
  684. * 将 values 插入键为 key 的 list 中,并设置时间
  685. * @param key 键
  686. * @param values 值
  687. * @param time 时间
  688. * @return true / false
  689. */
  690. public static boolean lSetList(String key, List<Object> values, long time) {
  691. if (redisTemplate == null) {
  692. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  693. }
  694. try {
  695. redisTemplate.opsForList().rightPushAll(key, values);
  696. if (time > 0) {
  697. expire(key, time);
  698. }
  699. return true;
  700. } catch (Exception e) {
  701. e.printStackTrace();
  702. return false;
  703. }
  704. }
  705. /**
  706. * 根据索引 index 修改键为 key 的值
  707. * @param key 键
  708. * @param index 索引
  709. * @param value 值
  710. * @return true / false
  711. */
  712. public static boolean lUpdateIndex(String key, long index, Object value) {
  713. if (redisTemplate == null) {
  714. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  715. }
  716. try {
  717. redisTemplate.opsForList().set(key, index, value);
  718. return true;
  719. } catch (Exception e) {
  720. e.printStackTrace();
  721. return false;
  722. }
  723. }
  724. /**
  725. * 在键为 key 的 list 中删除值为 value 的元素
  726. * @param key 键
  727. * @param count 如果 count == 0 则删除 list 中所有值为 value 的元素
  728. * 如果 count > 0 则删除 list 中最左边那个值为 value 的元素
  729. * 如果 count < 0 则删除 list 中最右边那个值为 value 的元素
  730. * @param value
  731. * @return
  732. */
  733. public static long lRemove(String key, long count, Object value) {
  734. if (redisTemplate == null) {
  735. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  736. }
  737. try {
  738. return redisTemplate.opsForList().remove(key, count, value);
  739. } catch (Exception e) {
  740. e.printStackTrace();
  741. return 0;
  742. }
  743. }
  744. /**
  745. * 在键为 key 的 list中移除第一个元素
  746. * @param key 键
  747. * @return
  748. */
  749. public static Object lLeftPop(String key) {
  750. if (redisTemplate == null) {
  751. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  752. }
  753. return redisTemplate.opsForList().leftPop(key);
  754. }
  755. /**
  756. * 在键为 key 的 list中移除、最后一个元素
  757. * @param key 键
  758. * @return
  759. */
  760. public static Object lrightPop(String key) {
  761. if (redisTemplate == null) {
  762. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  763. }
  764. return redisTemplate.opsForList().rightPop(key);
  765. }
  766. /**
  767. * 模糊查询
  768. * @param key 键
  769. * @return true / false
  770. */
  771. public static List<Object> keys(String key) {
  772. if (redisTemplate == null) {
  773. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  774. }
  775. try {
  776. Set<String> set = redisTemplate.keys(key);
  777. return new ArrayList<>(set);
  778. } catch (Exception e) {
  779. e.printStackTrace();
  780. return null;
  781. }
  782. }
  783. /**
  784. * 模糊查询
  785. * @param query 查询参数
  786. * @return
  787. */
  788. // public static List<Object> scan(String query) {
  789. // List<Object> result = new ArrayList<>();
  790. // try {
  791. // Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan("field",
  792. // ScanOptions.scanOptions().match(query).count(1000).build());
  793. // while (cursor.hasNext()) {
  794. // Map.Entry<Object,Object> entry = cursor.next();
  795. // result.add(entry.getKey());
  796. // Object key = entry.getKey();
  797. // Object valueSet = entry.getValue();
  798. // }
  799. // //关闭cursor
  800. // cursor.close();
  801. // } catch (Exception e) {
  802. // e.printStackTrace();
  803. // }
  804. // return result;
  805. // }
  806. /**
  807. * 模糊查询
  808. * @param query 查询参数
  809. * @return
  810. */
  811. public static List<Object> scan(String query) {
  812. if (redisTemplate == null) {
  813. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  814. }
  815. Set<String> resultKeys = (Set<String>) redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
  816. ScanOptions scanOptions = ScanOptions.scanOptions().match("*" + query + "*").count(1000).build();
  817. Cursor<byte[]> scan = connection.scan(scanOptions);
  818. Set<String> keys = new HashSet<>();
  819. while (scan.hasNext()) {
  820. byte[] next = scan.next();
  821. keys.add(new String(next));
  822. }
  823. return keys;
  824. });
  825. return new ArrayList<>(resultKeys);
  826. }
  827. // ============================== 消息发送与订阅 ==============================
  828. public static void convertAndSend(String channel, JSONObject msg) {
  829. if (redisTemplate == null) {
  830. redisTemplate = SpringBeanFactory.getBean("redisTemplate");
  831. }
  832. redisTemplate.convertAndSend(channel, msg);
  833. }
  834. }