RedisUtil.java 26 KB

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