RedisUtils.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  1. package com.poyee.redis;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.redisson.api.RedissonClient;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.data.redis.core.RedisTemplate;
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.util.CollectionUtils;
  8. import javax.annotation.Resource;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Set;
  12. import java.util.concurrent.TimeUnit;
  13. /**
  14. *
  15. * @author 基于spring和redis的redisTemplate工具类 针对所有的hash 都是以h开头的方法 针对所有的Set 都是以s开头的方法 不含通用方法 针对所有的List 都是以l开头的方法
  16. */
  17. @Slf4j
  18. @Component
  19. public class RedisUtils {
  20. @Resource
  21. private RedisTemplate<String, Object> redisTemplate;
  22. // @Autowired
  23. // private RedissonClient redissonClient;
  24. // =============================common============================
  25. private RedisUtils() {
  26. }
  27. /**
  28. * 指定缓存失效时间
  29. *
  30. * @param key
  31. * 键
  32. * @param time
  33. * 时间(秒)
  34. * @return
  35. */
  36. public boolean expire(String key, long time) {
  37. try {
  38. if (time > 0) {
  39. redisTemplate.expire(key, time, TimeUnit.SECONDS);
  40. }
  41. return true;
  42. } catch (Exception e) {
  43. log.error(key, e);
  44. return false;
  45. }
  46. }
  47. /**
  48. * 根据key 获取过期时间
  49. *
  50. * @param key
  51. * 键 不能为null
  52. * @return 时间(秒) 返回0代表为永久有效
  53. */
  54. public long getExpire(String key) {
  55. return redisTemplate.getExpire(key, TimeUnit.SECONDS);
  56. }
  57. /**
  58. * 获取key类型
  59. * @param key
  60. * @return
  61. */
  62. public String getType(String key){
  63. return redisTemplate.type(key).name();
  64. }
  65. /**
  66. * 判断key是否存在
  67. *
  68. * @param key
  69. * 键
  70. * @return true 存在 false不存在
  71. */
  72. public boolean hasKey(String key) {
  73. try {
  74. return redisTemplate.hasKey(key);
  75. } catch (Exception e) {
  76. log.error(key, e);
  77. return false;
  78. }
  79. }
  80. /**
  81. * 删除缓存
  82. *
  83. * @param key
  84. * 可以传一个值 或多个
  85. */
  86. @SuppressWarnings("unchecked")
  87. public void del(String... key) {
  88. if (key != null && key.length > 0) {
  89. if (key.length == 1) {
  90. redisTemplate.delete(key[0]);
  91. } else {
  92. redisTemplate.delete(CollectionUtils.arrayToList(key));
  93. }
  94. }
  95. }
  96. // ============================String=============================
  97. /**
  98. * 普通缓存获取
  99. *
  100. * @param key
  101. * 键
  102. * @return 值
  103. */
  104. public Object get(String key) {
  105. return key == null ? null : redisTemplate.opsForValue().get(key);
  106. }
  107. /**
  108. * 普通缓存放入
  109. *
  110. * @param key
  111. * 键
  112. * @param value
  113. * 值
  114. * @return true成功 false失败
  115. */
  116. public boolean set(String key, Object value) {
  117. try {
  118. redisTemplate.opsForValue().set(key, value);
  119. return true;
  120. } catch (Exception e) {
  121. log.error(key, e);
  122. return false;
  123. }
  124. }
  125. /**
  126. * 普通缓存放入并设置时间
  127. *
  128. * @param key
  129. * 键
  130. * @param value
  131. * 值
  132. * @param time
  133. * 时间(秒) time要大于0 如果time小于等于0 将设置无限期
  134. * @return true成功 false 失败
  135. */
  136. public boolean set(String key, Object value, long time) {
  137. try {
  138. if (time > 0) {
  139. redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
  140. } else {
  141. set(key, value);
  142. }
  143. return true;
  144. } catch (Exception e) {
  145. log.error(key, e);
  146. return false;
  147. }
  148. }
  149. /**
  150. * 递增 适用场景: https://blog.csdn.net/y_y_y_k_k_k_k/article/details/79218254 高并发生成订单号,秒杀类的业务逻辑等。。
  151. *
  152. * @param key 键
  153. * @param delta 要增加几(大于0)
  154. * @return
  155. */
  156. public long incr(String key, long delta) {
  157. if (delta < 0) {
  158. throw new RuntimeException("递增因子必须大于0");
  159. }
  160. return redisTemplate.opsForValue().increment(key, delta);
  161. }
  162. /**
  163. * 递减
  164. *
  165. * @param key
  166. * 键
  167. * @param delta 要减少几(小于0)
  168. * @return
  169. */
  170. public long decr(String key, long delta) {
  171. if (delta < 0) {
  172. throw new RuntimeException("递减因子必须大于0");
  173. }
  174. return redisTemplate.opsForValue().increment(key, -delta);
  175. }
  176. // ================================Map=================================
  177. /**
  178. * HashGet
  179. *
  180. * @param key
  181. * 键 不能为null
  182. * @param item
  183. * 项 不能为null
  184. * @return 值
  185. */
  186. public Object hget(String key, String item) {
  187. return redisTemplate.opsForHash().get(key, item);
  188. }
  189. /**
  190. * 获取hashKey对应的所有键值
  191. *
  192. * @param key
  193. * 键
  194. * @return 对应的多个键值
  195. */
  196. public Map<Object, Object> hmget(String key) {
  197. return redisTemplate.opsForHash().entries(key);
  198. }
  199. /**
  200. * HashSet
  201. *
  202. * @param key
  203. * 键
  204. * @param map
  205. * 对应多个键值
  206. * @return true 成功 false 失败
  207. */
  208. public boolean hmset(String key, Map<String, Object> map) {
  209. try {
  210. redisTemplate.opsForHash().putAll(key, map);
  211. return true;
  212. } catch (Exception e) {
  213. log.error(key, e);
  214. return false;
  215. }
  216. }
  217. /**
  218. * HashSet 并设置时间
  219. *
  220. * @param key
  221. * 键
  222. * @param map
  223. * 对应多个键值
  224. * @param time
  225. * 时间(秒)
  226. * @return true成功 false失败
  227. */
  228. public boolean hmset(String key, Map<String, Object> map, long time) {
  229. try {
  230. redisTemplate.opsForHash().putAll(key, map);
  231. if (time > 0) {
  232. expire(key, time);
  233. }
  234. return true;
  235. } catch (Exception e) {
  236. log.error(key, e);
  237. return false;
  238. }
  239. }
  240. /**
  241. * 向一张hash表中放入数据,如果不存在将创建
  242. *
  243. * @param key
  244. * 键
  245. * @param item
  246. * 项
  247. * @param value
  248. * 值
  249. * @return true 成功 false失败
  250. */
  251. public boolean hset(String key, String item, Object value) {
  252. try {
  253. redisTemplate.opsForHash().put(key, item, value);
  254. return true;
  255. } catch (Exception e) {
  256. log.error(key, e);
  257. return false;
  258. }
  259. }
  260. /**
  261. * 向一张hash表中放入数据,如果不存在将创建
  262. *
  263. * @param key
  264. * 键
  265. * @param item
  266. * 项
  267. * @param value
  268. * 值
  269. * @param time
  270. * 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
  271. * @return true 成功 false失败
  272. */
  273. public boolean hset(String key, String item, Object value, long time) {
  274. try {
  275. redisTemplate.opsForHash().put(key, item, value);
  276. if (time > 0) {
  277. expire(key, time);
  278. }
  279. return true;
  280. } catch (Exception e) {
  281. log.error(key, e);
  282. return false;
  283. }
  284. }
  285. /**
  286. * 删除hash表中的值
  287. *
  288. * @param key
  289. * 键 不能为null
  290. * @param item
  291. * 项 可以使多个 不能为null
  292. */
  293. public void hdel(String key, Object... item) {
  294. redisTemplate.opsForHash().delete(key, item);
  295. }
  296. /**
  297. * 判断hash表中是否有该项的值
  298. *
  299. * @param key
  300. * 键 不能为null
  301. * @param item
  302. * 项 不能为null
  303. * @return true 存在 false不存在
  304. */
  305. public boolean hHasKey(String key, String item) {
  306. return redisTemplate.opsForHash().hasKey(key, item);
  307. }
  308. /**
  309. * hash递增 如果不存在,就会创建一个 并把新增后的值返回
  310. *
  311. * @param key
  312. * 键
  313. * @param item
  314. * 项
  315. * @param by
  316. * 要增加几(大于0)
  317. * @return
  318. */
  319. public double hincr(String key, String item, double by) {
  320. return redisTemplate.opsForHash().increment(key, item, by);
  321. }
  322. /**
  323. * hash递减
  324. *
  325. * @param key
  326. * 键
  327. * @param item
  328. * 项
  329. * @param by
  330. * 要减少记(小于0)
  331. * @return
  332. */
  333. public double hdecr(String key, String item, double by) {
  334. return redisTemplate.opsForHash().increment(key, item, -by);
  335. }
  336. // ============================set=============================
  337. /**
  338. * 根据key获取Set中的所有值
  339. *
  340. * @param key
  341. * 键
  342. * @return
  343. */
  344. public Set<Object> sGet(String key) {
  345. try {
  346. return redisTemplate.opsForSet().members(key);
  347. } catch (Exception e) {
  348. log.error(key, e);
  349. return null;
  350. }
  351. }
  352. /**
  353. * 根据value从一个set中查询,是否存在
  354. *
  355. * @param key
  356. * 键
  357. * @param value
  358. * 值
  359. * @return true 存在 false不存在
  360. */
  361. public boolean sHasKey(String key, Object value) {
  362. try {
  363. return redisTemplate.opsForSet().isMember(key, value);
  364. } catch (Exception e) {
  365. log.error(key, e);
  366. return false;
  367. }
  368. }
  369. /**
  370. * 将数据放入set缓存
  371. *
  372. * @param key
  373. * 键
  374. * @param values
  375. * 值 可以是多个
  376. * @return 成功个数
  377. */
  378. public long sSet(String key, Object... values) {
  379. try {
  380. return redisTemplate.opsForSet().add(key, values);
  381. } catch (Exception e) {
  382. log.error(key, e);
  383. return 0;
  384. }
  385. }
  386. /**
  387. * 将set数据放入缓存
  388. *
  389. * @param key
  390. * 键
  391. * @param time
  392. * 时间(秒)
  393. * @param values
  394. * 值 可以是多个
  395. * @return 成功个数
  396. */
  397. public long sSetAndTime(String key, long time, Object... values) {
  398. try {
  399. Long count = redisTemplate.opsForSet().add(key, values);
  400. if (time > 0)
  401. expire(key, time);
  402. return count;
  403. } catch (Exception e) {
  404. log.error(key, e);
  405. return 0;
  406. }
  407. }
  408. /**
  409. * 获取set缓存的长度
  410. *
  411. * @param key
  412. * 键
  413. * @return
  414. */
  415. public long sGetSetSize(String key) {
  416. try {
  417. return redisTemplate.opsForSet().size(key);
  418. } catch (Exception e) {
  419. log.error(key, e);
  420. return 0;
  421. }
  422. }
  423. /**
  424. * 移除值为value的
  425. *
  426. * @param key
  427. * 键
  428. * @param values
  429. * 值 可以是多个
  430. * @return 移除的个数
  431. */
  432. public long setRemove(String key, Object... values) {
  433. try {
  434. Long count = redisTemplate.opsForSet().remove(key, values);
  435. return count;
  436. } catch (Exception e) {
  437. log.error(key, e);
  438. return 0;
  439. }
  440. }
  441. // ============================zset=============================
  442. /**
  443. * 根据key获取Set中的所有值
  444. *
  445. * @param key
  446. * 键
  447. * @return
  448. */
  449. public Set<Object> zSGet(String key) {
  450. try {
  451. return redisTemplate.opsForSet().members(key);
  452. } catch (Exception e) {
  453. log.error(key, e);
  454. return null;
  455. }
  456. }
  457. /**
  458. * 根据value从一个set中查询,是否存在
  459. *
  460. * @param key
  461. * 键
  462. * @param value
  463. * 值
  464. * @return true 存在 false不存在
  465. */
  466. public boolean zSHasKey(String key, Object value) {
  467. try {
  468. return redisTemplate.opsForSet().isMember(key, value);
  469. } catch (Exception e) {
  470. log.error(key, e);
  471. return false;
  472. }
  473. }
  474. public Boolean zSSet(String key, Object value, double score) {
  475. try {
  476. return redisTemplate.opsForZSet().add(key, value, 2);
  477. } catch (Exception e) {
  478. log.error(key, e);
  479. return false;
  480. }
  481. }
  482. /**
  483. * 将set数据放入缓存
  484. *
  485. * @param key
  486. * 键
  487. * @param time
  488. * 时间(秒)
  489. * @param values
  490. * 值 可以是多个
  491. * @return 成功个数
  492. */
  493. public long zSSetAndTime(String key, long time, Object... values) {
  494. try {
  495. Long count = redisTemplate.opsForSet().add(key, values);
  496. if (time > 0)
  497. expire(key, time);
  498. return count;
  499. } catch (Exception e) {
  500. log.error(key, e);
  501. return 0;
  502. }
  503. }
  504. /**
  505. * 获取set缓存的长度
  506. *
  507. * @param key
  508. * 键
  509. * @return
  510. */
  511. public long zSGetSetSize(String key) {
  512. try {
  513. return redisTemplate.opsForSet().size(key);
  514. } catch (Exception e) {
  515. log.error(key, e);
  516. return 0;
  517. }
  518. }
  519. /**
  520. * 移除值为value的
  521. *
  522. * @param key
  523. * 键
  524. * @param values
  525. * 值 可以是多个
  526. * @return 移除的个数
  527. */
  528. public long zSetRemove(String key, Object... values) {
  529. try {
  530. Long count = redisTemplate.opsForSet().remove(key, values);
  531. return count;
  532. } catch (Exception e) {
  533. log.error(key, e);
  534. return 0;
  535. }
  536. }
  537. // ===============================list=================================
  538. /**
  539. * 获取list缓存的内容
  540. *
  541. * @取出来的元素 总数 end-start+1
  542. *
  543. * @param key
  544. * 键
  545. * @param start
  546. * 开始 0 是第一个元素
  547. * @param end
  548. * 结束 -1代表所有值
  549. * @return
  550. */
  551. public List<Object> lGet(String key, long start, long end) {
  552. try {
  553. return redisTemplate.opsForList().range(key, start, end);
  554. } catch (Exception e) {
  555. log.error(key, e);
  556. return null;
  557. }
  558. }
  559. /**
  560. * 获取list缓存的长度
  561. *
  562. * @param key
  563. * 键
  564. * @return
  565. */
  566. public long lGetListSize(String key) {
  567. try {
  568. return redisTemplate.opsForList().size(key);
  569. } catch (Exception e) {
  570. log.error(key, e);
  571. return 0;
  572. }
  573. }
  574. /**
  575. * 通过索引 获取list中的值
  576. *
  577. * @param key
  578. * 键
  579. * @param index
  580. * 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
  581. * @return
  582. */
  583. public Object lGetIndex(String key, long index) {
  584. try {
  585. return redisTemplate.opsForList().index(key, index);
  586. } catch (Exception e) {
  587. log.error(key, e);
  588. return null;
  589. }
  590. }
  591. /**
  592. * 将list放入缓存
  593. *
  594. * @param key
  595. * 键
  596. * @param value
  597. * 值
  598. * @param
  599. *
  600. * @return
  601. */
  602. public boolean lSet(String key, Object value) {
  603. try {
  604. redisTemplate.opsForList().rightPush(key, value);
  605. return true;
  606. } catch (Exception e) {
  607. log.error(key, e);
  608. return false;
  609. }
  610. }
  611. public boolean lPut(String key, List value) {
  612. if(null == value) return false;
  613. try {
  614. redisTemplate.opsForList().rightPushAll(key, value);
  615. return true;
  616. } catch (Exception e) {
  617. log.error(key, e);
  618. return false;
  619. }
  620. }
  621. public boolean lCommit(String key ,List value){
  622. try {
  623. redisTemplate.delete(key);
  624. lPut(key, value);
  625. return true;
  626. } catch (Exception e) {
  627. log.error(key, e);
  628. return false;
  629. }
  630. }
  631. /**
  632. * 将list放入缓存
  633. *
  634. * @param key
  635. * 键
  636. * @param value
  637. * 值
  638. * @param time
  639. * 时间(秒)
  640. * @return
  641. */
  642. public boolean lSet(String key, Object value, long time) {
  643. try {
  644. redisTemplate.opsForList().rightPush(key, value);
  645. if (time > 0)
  646. expire(key, time);
  647. return true;
  648. } catch (Exception e) {
  649. log.error(key, e);
  650. return false;
  651. }
  652. }
  653. /**
  654. * 将list放入缓存
  655. *
  656. * @param key
  657. * 键
  658. * @param value
  659. * 值
  660. * @param
  661. * //时间(秒)
  662. * @return
  663. */
  664. public boolean lSet(String key, List<Object> value) {
  665. try {
  666. redisTemplate.opsForList().rightPushAll(key, value);
  667. return true;
  668. } catch (Exception e) {
  669. log.error(key, e);
  670. return false;
  671. }
  672. }
  673. /**
  674. * 将list放入缓存
  675. *
  676. * @param key
  677. * 键
  678. * @param value
  679. * 值
  680. * @param time
  681. * 时间(秒)
  682. * @return
  683. */
  684. public boolean lSet(String key, List<Object> value, long time) {
  685. try {
  686. redisTemplate.opsForList().rightPushAll(key, value);
  687. if (time > 0)
  688. expire(key, time);
  689. return true;
  690. } catch (Exception e) {
  691. log.error(key, e);
  692. return false;
  693. }
  694. }
  695. /**
  696. * 根据索引修改list中的某条数据
  697. *
  698. * @param key
  699. * 键
  700. * @param index
  701. * 索引
  702. * @param value
  703. * 值
  704. * @return
  705. */
  706. public boolean lUpdateIndex(String key, long index, Object value) {
  707. try {
  708. redisTemplate.opsForList().set(key, index, value);
  709. return true;
  710. } catch (Exception e) {
  711. log.error(key, e);
  712. return false;
  713. }
  714. }
  715. /**
  716. * 移除N个值为value
  717. *
  718. * @param key
  719. * 键
  720. * @param count
  721. * 移除多少个
  722. * @param value
  723. * 值
  724. * @return 移除的个数
  725. */
  726. public long lRemove(String key, long count, Object value) {
  727. try {
  728. return redisTemplate.opsForList().remove(key, count, value);
  729. } catch (Exception e) {
  730. log.error(key, e);
  731. return 0;
  732. }
  733. }
  734. public Set<String> allKeys(){
  735. return redisTemplate.keys("*");
  736. }
  737. }