当前位置:   article > 正文

使用redis实现手机短信验证功能_redis验证码验证设计

redis验证码验证设计

使用redis实现以下功能
1:手机短信验证,每条验证码有效期为1分钟,
2:1分钟内如果该手机号再次获取验证码,则提示短信已发送,请XX分钟后(剩余过期时间)重新获取3:每个手机号每天最多只能发送3次,24小时后可发送次数重置

1.定义一个PhoneController类

  1. package com.redis.controller;
  2. import com.redis.service.PhoneService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. @RequestMapping("/phone")
  8. public class PhoneController {
  9. @Autowired
  10. private PhoneService phoneService;
  11. //发送验证码
  12. @RequestMapping("/send")
  13. public Object send(String phone){
  14. return phoneService.send(phone);
  15. }
  16. //校验验证码
  17. @RequestMapping("/check")
  18. public Object check(String phone,String code){
  19. return phoneService.check(phone,code);
  20. }
  21. }

2.定义一个PhoneService来做逻辑处理

  1. package com.redis.service;
  2. import cn.hutool.core.util.RandomUtil;
  3. import org.springframework.data.redis.core.StringRedisTemplate;
  4. import org.springframework.stereotype.Service;
  5. import javax.annotation.Resource;
  6. import java.util.concurrent.TimeUnit;
  7. @Service
  8. public class PhoneService {
  9. //定义一个StringRedisTemplate,方便调用而且不需要再自己定义序列化的代码
  10. @Resource
  11. private StringRedisTemplate stringRedisTemplate;
  12. public Object send(String phone) {
  13. //用手机号拼接上字符串来作为key值,这是作为发送的次数
  14. String countKey = phone + "_COUNT";
  15. //用手机号拼接上字符串来作为key值,来表示你的验证码
  16. String codeKey = phone + "_CODE";
  17. try {
  18. //根据countKey来获取发送的次数
  19. String countStr = stringRedisTemplate.opsForValue().get(countKey);
  20. Integer count;
  21. try {
  22. //String类型的次数来强转为Integer
  23. count = Integer.valueOf(countStr);
  24. }catch (NumberFormatException e){
  25. count = 0;
  26. }
  27. if(count > 2){
  28. System.out.println("24小时内短信发送次数已达3次,不能继续发送!24小时后重置次数");
  29. //做判断来表示发送三次,再次发送失败
  30. return false;
  31. }
  32. //判断codeKey是否存在
  33. boolean isTtl = stringRedisTemplate.hasKey(codeKey);
  34. if(isTtl){
  35. //如果存在的获取还有多少秒过期
  36. long ttlCode = stringRedisTemplate.getExpire(codeKey);
  37. System.out.println("验证码在1分钟内保持有效,请于"+ttlCode+"秒之后再次发送");
  38. return false;
  39. }
  40. //获取6位数的随机数
  41. //这个地方如果换成手机短信的api接口的话就可以实现手机短信验证的功能
  42. String code = RandomUtil.randomNumbers(6);
  43. //保存在随机数中设置过期时间
  44. stringRedisTemplate.opsForValue().set(codeKey,code,1, TimeUnit.MINUTES);
  45. //设置过期时间为1
  46. long timeOut = 24 * 60 * 60;
  47. //做一个判断如果不是第一次发送,就要根据countKey来获取他的剩余的过期时间
  48. if(count!=0){
  49. //如果这个地方是短信验证的功能的话就是可以换成根据countKey来获取它是否存在来判断是否验证码过期
  50. timeOut = stringRedisTemplate.getExpire(countKey);
  51. }
  52. stringRedisTemplate.opsForValue().set(countKey,String.valueOf(count+1),timeOut,TimeUnit.SECONDS);
  53. System.out.println("短信验证码发送完毕!请注意查收!");
  54. return true;
  55. }catch (Exception e){
  56. stringRedisTemplate.delete(codeKey);
  57. stringRedisTemplate.delete(countKey);
  58. return false;
  59. }
  60. }
  61. public Object check(String phone, String code) {
  62. String redisCode = stringRedisTemplate.opsForValue().get(phone + "_CODE");
  63. return code.equals(redisCode);
  64. }
  65. }

3.在本功能中需要用到的redis工具类

  1. package com.redis.utils;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.connection.DataType;
  4. import org.springframework.data.redis.core.Cursor;
  5. import org.springframework.data.redis.core.ScanOptions;
  6. import org.springframework.data.redis.core.StringRedisTemplate;
  7. import org.springframework.data.redis.core.ZSetOperations;
  8. import org.springframework.stereotype.Component;
  9. import java.util.*;
  10. import java.util.concurrent.TimeUnit;
  11. /**
  12. * Redis静态工具类
  13. */
  14. @Component
  15. public final class RedisTools {
  16. private static StringRedisTemplate redisTemplate;
  17. @Autowired
  18. public void setRedisTemplate(StringRedisTemplate redisTemplate) {
  19. RedisTools.redisTemplate = redisTemplate;
  20. }
  21. /** -------------------key相关操作--------------------- */
  22. /**
  23. * 删除key
  24. *
  25. * @param key
  26. */
  27. public static void delete(String key) {
  28. redisTemplate.delete(key);
  29. }
  30. /**
  31. * 批量删除key
  32. *
  33. * @param keys
  34. */
  35. public static void delete(Collection<String> keys) {
  36. redisTemplate.delete(keys);
  37. }
  38. /**
  39. * 序列化key
  40. *
  41. * @param key
  42. * @return
  43. */
  44. public static byte[] dump(String key) {
  45. return redisTemplate.dump(key);
  46. }
  47. /**
  48. * 是否存在key
  49. *
  50. * @param key
  51. * @return
  52. */
  53. public static Boolean hasKey(String key) {
  54. return redisTemplate.hasKey(key);
  55. }
  56. /**
  57. * 设置过期时间
  58. *
  59. * @param key
  60. * @param timeout
  61. * @param unit
  62. * @return
  63. */
  64. public static Boolean expire(String key, long timeout, TimeUnit unit) {
  65. return redisTemplate.expire(key, timeout, unit);
  66. }
  67. /**
  68. * 设置过期时间
  69. *
  70. * @param key
  71. * @param date
  72. * @return
  73. */
  74. public static Boolean expireAt(String key, Date date) {
  75. return redisTemplate.expireAt(key, date);
  76. }
  77. /**
  78. * 查找匹配的key
  79. *
  80. * @param pattern
  81. * @return
  82. */
  83. public static Set<String> keys(String pattern) {
  84. return redisTemplate.keys(pattern);
  85. }
  86. /**
  87. * 将当前数据库的 key 移动到给定的数据库 db 当中
  88. *
  89. * @param key
  90. * @param dbIndex
  91. * @return
  92. */
  93. public static Boolean move(String key, int dbIndex) {
  94. return redisTemplate.move(key, dbIndex);
  95. }
  96. /**
  97. * 移除 key 的过期时间,key 将持久保持
  98. *
  99. * @param key
  100. * @return
  101. */
  102. public static Boolean persist(String key) {
  103. return redisTemplate.persist(key);
  104. }
  105. /**
  106. * 返回 key 的剩余的过期时间
  107. *
  108. * @param key
  109. * @param unit
  110. * @return
  111. */
  112. public static Long getExpire(String key, TimeUnit unit) {
  113. return redisTemplate.getExpire(key, unit);
  114. }
  115. /**
  116. * 返回 key 的剩余的过期时间
  117. *
  118. * @param key
  119. * @return
  120. */
  121. public static Long getExpire(String key) {
  122. return redisTemplate.getExpire(key);
  123. }
  124. /**
  125. * 从当前数据库中随机返回一个 key
  126. *
  127. * @return
  128. */
  129. public static String randomKey() {
  130. return redisTemplate.randomKey();
  131. }
  132. /**
  133. * 修改 key 的名称
  134. *
  135. * @param oldKey
  136. * @param newKey
  137. */
  138. public static void rename(String oldKey, String newKey) {
  139. redisTemplate.rename(oldKey, newKey);
  140. }
  141. /**
  142. * 仅当 newkey 不存在时,将 oldKey 改名为 newkey
  143. *
  144. * @param oldKey
  145. * @param newKey
  146. * @return
  147. */
  148. public static Boolean renameIfAbsent(String oldKey, String newKey) {
  149. return redisTemplate.renameIfAbsent(oldKey, newKey);
  150. }
  151. /**
  152. * 返回 key 所储存的值的类型
  153. *
  154. * @param key
  155. * @return
  156. */
  157. public static DataType type(String key) {
  158. return redisTemplate.type(key);
  159. }
  160. /** -------------------string相关操作--------------------- */
  161. /**
  162. * 设置指定 key 的值
  163. *
  164. * @param key
  165. * @param value
  166. */
  167. public static void set(String key, String value) {
  168. redisTemplate.opsForValue().set(key, value);
  169. }
  170. /**
  171. * 获取指定 key 的值
  172. *
  173. * @param key
  174. * @return
  175. */
  176. public static String get(String key) {
  177. return redisTemplate.opsForValue().get(key);
  178. }
  179. /**
  180. * 返回 key 中字符串值的子字符
  181. *
  182. * @param key
  183. * @param start
  184. * @param end
  185. * @return
  186. */
  187. public static String getRange(String key, long start, long end) {
  188. return redisTemplate.opsForValue().get(key, start, end);
  189. }
  190. /**
  191. * 将给定 key 的值设为 value ,并返回 key 的旧值(old value)
  192. *
  193. * @param key
  194. * @param value
  195. * @return
  196. */
  197. public static String getAndSet(String key, String value) {
  198. return redisTemplate.opsForValue().getAndSet(key, value);
  199. }
  200. /**
  201. * 对 key 所储存的字符串值,获取指定偏移量上的位(bit)
  202. * @param key
  203. * @param offset
  204. * @return
  205. */
  206. public static Boolean getBit(String key, long offset) {
  207. return redisTemplate.opsForValue().getBit(key, offset);
  208. }
  209. /**
  210. * 批量获取
  211. *
  212. * @param keys
  213. * @return
  214. */
  215. public static List<String> multiGet(Collection<String> keys) {
  216. return redisTemplate.opsForValue().multiGet(keys);
  217. }
  218. /**
  219. * 设置ASCII码, 字符串'a'的ASCII码是97, 转为二进制是'01100001', 此方法是将二进制第offset位值变为value
  220. *
  221. * @param key 位置
  222. * @param value 值,true为1, false为0
  223. * @return
  224. */
  225. public static boolean setBit(String key, long offset, boolean value) {
  226. return redisTemplate.opsForValue().setBit(key, offset, value);
  227. }
  228. /**
  229. * 将值 value 关联到 key ,并将 key 的过期时间设为 timeout
  230. *
  231. * @param key
  232. * @param value
  233. * @param timeout 过期时间
  234. * @param unit 时间单位, 天:TimeUnit.DAYS 小时:TimeUnit.HOURS 分钟:TimeUnit.MINUTES
  235. * 秒:TimeUnit.SECONDS 毫秒:TimeUnit.MILLISECONDS
  236. */
  237. public static void setEx(String key, String value, long timeout, TimeUnit unit) {
  238. redisTemplate.opsForValue().set(key, value, timeout, unit);
  239. }
  240. /**
  241. * 只有在 key 不存在时设置 key 的值
  242. *
  243. * @param key
  244. * @param value
  245. * @return 之前已经存在返回false, 不存在返回true
  246. */
  247. public static boolean setIfAbsent(String key, String value) {
  248. return redisTemplate.opsForValue().setIfAbsent(key, value);
  249. }
  250. /**
  251. * 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
  252. *
  253. * @param key
  254. * @param value
  255. * @param offset 从指定位置开始覆写
  256. */
  257. public static void setRange(String key, String value, long offset) {
  258. redisTemplate.opsForValue().set(key, value, offset);
  259. }
  260. /**
  261. * 获取字符串的长度
  262. *
  263. * @param key
  264. * @return
  265. */
  266. public static Long size(String key) {
  267. return redisTemplate.opsForValue().size(key);
  268. }
  269. /**
  270. * 批量添加
  271. *
  272. * @param maps
  273. */
  274. public static void multiSet(Map<String, String> maps) {
  275. redisTemplate.opsForValue().multiSet(maps);
  276. }
  277. /**
  278. * 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
  279. *
  280. * @param maps
  281. * @return 之前已经存在返回false, 不存在返回true
  282. */
  283. public static boolean multiSetIfAbsent(Map<String, String> maps) {
  284. return redisTemplate.opsForValue().multiSetIfAbsent(maps);
  285. }
  286. /**
  287. * 增加(自增长), 负数则为自减
  288. *
  289. * @param key
  290. * @return
  291. */
  292. public static Long incrBy(String key, long increment) {
  293. return redisTemplate.opsForValue().increment(key, increment);
  294. }
  295. /**
  296. * @param key
  297. * @return
  298. */
  299. public static Double incrByFloat(String key, double increment) {
  300. return redisTemplate.opsForValue().increment(key, increment);
  301. }
  302. /**
  303. * 追加到末尾
  304. *
  305. * @param key
  306. * @param value
  307. * @return
  308. */
  309. public static Integer append(String key, String value) {
  310. return redisTemplate.opsForValue().append(key, value);
  311. }
  312. /** -------------------hash相关操作------------------------- */
  313. /**
  314. * 获取存储在哈希表中指定字段的值
  315. *
  316. * @param key
  317. * @param field
  318. * @return
  319. */
  320. public static Object hGet(String key, String field) {
  321. return redisTemplate.opsForHash().get(key, field);
  322. }
  323. /**
  324. * 获取所有给定字段的值
  325. *
  326. * @param key
  327. * @return
  328. */
  329. public static Map<Object, Object> hGetAll(String key) {
  330. return redisTemplate.opsForHash().entries(key);
  331. }
  332. /**
  333. * 获取所有给定字段的值
  334. *
  335. * @param key
  336. * @param fields
  337. * @return
  338. */
  339. public static List<Object> hMultiGet(String key, Collection<Object> fields) {
  340. return redisTemplate.opsForHash().multiGet(key, fields);
  341. }
  342. public static void hPut(String key, String hashKey, String value) {
  343. redisTemplate.opsForHash().put(key, hashKey, value);
  344. }
  345. public static void hPutAll(String key, Map<String, String> maps) {
  346. redisTemplate.opsForHash().putAll(key, maps);
  347. }
  348. /**
  349. * 仅当hashKey不存在时才设置
  350. *
  351. * @param key
  352. * @param hashKey
  353. * @param value
  354. * @return
  355. */
  356. public static Boolean hPutIfAbsent(String key, String hashKey, String value) {
  357. return redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);
  358. }
  359. /**
  360. * 删除一个或多个哈希表字段
  361. *
  362. * @param key
  363. * @param fields
  364. * @return
  365. */
  366. public static Long hDelete(String key, Object... fields) {
  367. return redisTemplate.opsForHash().delete(key, fields);
  368. }
  369. /**
  370. * 查看哈希表 key 中,指定的字段是否存在
  371. *
  372. * @param key
  373. * @param field
  374. * @return
  375. */
  376. public static boolean hExists(String key, String field) {
  377. return redisTemplate.opsForHash().hasKey(key, field);
  378. }
  379. /**
  380. * 为哈希表 key 中的指定字段的整数值加上增量 increment
  381. *
  382. * @param key
  383. * @param field
  384. * @param increment
  385. * @return
  386. */
  387. public static Long hIncrBy(String key, Object field, long increment) {
  388. return redisTemplate.opsForHash().increment(key, field, increment);
  389. }
  390. /**
  391. * 为哈希表 key 中的指定字段的整数值加上增量 increment
  392. *
  393. * @param key
  394. * @param field
  395. * @param delta
  396. * @return
  397. */
  398. public static Double hIncrByFloat(String key, Object field, double delta) {
  399. return redisTemplate.opsForHash().increment(key, field, delta);
  400. }
  401. /**
  402. * 获取所有哈希表中的字段
  403. *
  404. * @param key
  405. * @return
  406. */
  407. public static Set<Object> hKeys(String key) {
  408. return redisTemplate.opsForHash().keys(key);
  409. }
  410. /**
  411. * 获取哈希表中字段的数量
  412. *
  413. * @param key
  414. * @return
  415. */
  416. public static Long hSize(String key) {
  417. return redisTemplate.opsForHash().size(key);
  418. }
  419. /**
  420. * 获取哈希表中所有值
  421. *
  422. * @param key
  423. * @return
  424. */
  425. public static List<Object> hValues(String key) {
  426. return redisTemplate.opsForHash().values(key);
  427. }
  428. /**
  429. * 迭代哈希表中的键值对
  430. *
  431. * @param key
  432. * @param options
  433. * @return
  434. */
  435. public static Cursor<Map.Entry<Object, Object>> hScan(String key, ScanOptions options) {
  436. return redisTemplate.opsForHash().scan(key, options);
  437. }
  438. /** ------------------------list相关操作---------------------------- */
  439. /**
  440. * 通过索引获取列表中的元素
  441. *
  442. * @param key
  443. * @param index
  444. * @return
  445. */
  446. public static String lIndex(String key, long index) {
  447. return redisTemplate.opsForList().index(key, index);
  448. }
  449. /**
  450. * 获取列表指定范围内的元素
  451. *
  452. * @param key
  453. * @param start 开始位置, 0是开始位置
  454. * @param end 结束位置, -1返回所有
  455. * @return
  456. */
  457. public static List<String> lRange(String key, long start, long end) {
  458. return redisTemplate.opsForList().range(key, start, end);
  459. }
  460. /**
  461. * 存储在list头部
  462. *
  463. * @param key
  464. * @param value
  465. * @return
  466. */
  467. public static Long lLeftPush(String key, String value) {
  468. return redisTemplate.opsForList().leftPush(key, value);
  469. }
  470. /**
  471. * @param key
  472. * @param value
  473. * @return
  474. */
  475. public static Long lLeftPushAll(String key, String... value) {
  476. return redisTemplate.opsForList().leftPushAll(key, value);
  477. }
  478. /**
  479. * @param key
  480. * @param value
  481. * @return
  482. */
  483. public static Long lLeftPushAll(String key, Collection<String> value) {
  484. return redisTemplate.opsForList().leftPushAll(key, value);
  485. }
  486. /**
  487. * 当list存在的时候才加入
  488. *
  489. * @param key
  490. * @param value
  491. * @return
  492. */
  493. public static Long lLeftPushIfPresent(String key, String value) {
  494. return redisTemplate.opsForList().leftPushIfPresent(key, value);
  495. }
  496. /**
  497. * 如果pivot存在,再pivot前面添加
  498. *
  499. * @param key
  500. * @param pivot
  501. * @param value
  502. * @return
  503. */
  504. public static Long lLeftPush(String key, String pivot, String value) {
  505. return redisTemplate.opsForList().leftPush(key, pivot, value);
  506. }
  507. /**
  508. * @param key
  509. * @param value
  510. * @return
  511. */
  512. public static Long lRightPush(String key, String value) {
  513. return redisTemplate.opsForList().rightPush(key, value);
  514. }
  515. /**
  516. * @param key
  517. * @param value
  518. * @return
  519. */
  520. public static Long lRightPushAll(String key, String... value) {
  521. return redisTemplate.opsForList().rightPushAll(key, value);
  522. }
  523. /**
  524. * @param key
  525. * @param value
  526. * @return
  527. */
  528. public static Long lRightPushAll(String key, Collection<String> value) {
  529. return redisTemplate.opsForList().rightPushAll(key, value);
  530. }
  531. /**
  532. * 为已存在的列表添加值
  533. *
  534. * @param key
  535. * @param value
  536. * @return
  537. */
  538. public static Long lRightPushIfPresent(String key, String value) {
  539. return redisTemplate.opsForList().rightPushIfPresent(key, value);
  540. }
  541. /**
  542. * 在pivot元素的右边添加值
  543. *
  544. * @param key
  545. * @param pivot
  546. * @param value
  547. * @return
  548. */
  549. public static Long lRightPush(String key, String pivot, String value) {
  550. return redisTemplate.opsForList().rightPush(key, pivot, value);
  551. }
  552. /**
  553. * 通过索引设置列表元素的值
  554. *
  555. * @param key
  556. * @param index 位置
  557. * @param value
  558. */
  559. public static void lSet(String key, long index, String value) {
  560. redisTemplate.opsForList().set(key, index, value);
  561. }
  562. /**
  563. * 移出并获取列表的第一个元素
  564. *
  565. * @param key
  566. * @return 删除的元素
  567. */
  568. public static String lLeftPop(String key) {
  569. return redisTemplate.opsForList().leftPop(key);
  570. }
  571. /**
  572. * 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
  573. *
  574. * @param key
  575. * @param timeout 等待时间
  576. * @param unit 时间单位
  577. * @return
  578. */
  579. public static String lBLeftPop(String key, long timeout, TimeUnit unit) {
  580. return redisTemplate.opsForList().leftPop(key, timeout, unit);
  581. }
  582. /**
  583. * 移除并获取列表最后一个元素
  584. *
  585. * @param key
  586. * @return 删除的元素
  587. */
  588. public static String lRightPop(String key) {
  589. return redisTemplate.opsForList().rightPop(key);
  590. }
  591. /**
  592. * 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
  593. *
  594. * @param key
  595. * @param timeout 等待时间
  596. * @param unit 时间单位
  597. * @return
  598. */
  599. public static String lBRightPop(String key, long timeout, TimeUnit unit) {
  600. return redisTemplate.opsForList().rightPop(key, timeout, unit);
  601. }
  602. /**
  603. * 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
  604. *
  605. * @param sourceKey
  606. * @param destinationKey
  607. * @return
  608. */
  609. public static String lRightPopAndLeftPush(String sourceKey, String destinationKey) {
  610. return redisTemplate.opsForList().rightPopAndLeftPush(sourceKey,
  611. destinationKey);
  612. }
  613. /**
  614. * 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
  615. *
  616. * @param sourceKey
  617. * @param destinationKey
  618. * @param timeout
  619. * @param unit
  620. * @return
  621. */
  622. public static String lBRightPopAndLeftPush(String sourceKey, String destinationKey,
  623. long timeout, TimeUnit unit) {
  624. return redisTemplate.opsForList().rightPopAndLeftPush(sourceKey,
  625. destinationKey, timeout, unit);
  626. }
  627. /**
  628. * 删除集合中值等于value得元素
  629. *
  630. * @param key
  631. * @param index index=0, 删除所有值等于value的元素; index>0, 从头部开始删除第一个值等于value的元素;
  632. * index<0, 从尾部开始删除第一个值等于value的元素;
  633. * @param value
  634. * @return
  635. */
  636. public static Long lRemove(String key, long index, String value) {
  637. return redisTemplate.opsForList().remove(key, index, value);
  638. }
  639. /**
  640. * 裁剪list
  641. *
  642. * @param key
  643. * @param start
  644. * @param end
  645. */
  646. public static void lTrim(String key, long start, long end) {
  647. redisTemplate.opsForList().trim(key, start, end);
  648. }
  649. /**
  650. * 获取列表长度
  651. *
  652. * @param key
  653. * @return
  654. */
  655. public static Long lLen(String key) {
  656. return redisTemplate.opsForList().size(key);
  657. }
  658. /** --------------------set相关操作-------------------------- */
  659. /**
  660. * set添加元素
  661. *
  662. * @param key
  663. * @param values
  664. * @return
  665. */
  666. public static Long sAdd(String key, String... values) {
  667. return redisTemplate.opsForSet().add(key, values);
  668. }
  669. /**
  670. * set移除元素
  671. *
  672. * @param key
  673. * @param values
  674. * @return
  675. */
  676. public static Long sRemove(String key, Object... values) {
  677. return redisTemplate.opsForSet().remove(key, values);
  678. }
  679. /**
  680. * 移除并返回集合的一个随机元素
  681. *
  682. * @param key
  683. * @return
  684. */
  685. public static String sPop(String key) {
  686. return redisTemplate.opsForSet().pop(key);
  687. }
  688. /**
  689. * 将元素value从一个集合移到另一个集合
  690. *
  691. * @param key
  692. * @param value
  693. * @param destKey
  694. * @return
  695. */
  696. public static Boolean sMove(String key, String value, String destKey) {
  697. return redisTemplate.opsForSet().move(key, value, destKey);
  698. }
  699. /**
  700. * 获取集合的大小
  701. *
  702. * @param key
  703. * @return
  704. */
  705. public static Long sSize(String key) {
  706. return redisTemplate.opsForSet().size(key);
  707. }
  708. /**
  709. * 判断集合是否包含value
  710. *
  711. * @param key
  712. * @param value
  713. * @return
  714. */
  715. public static Boolean sIsMember(String key, Object value) {
  716. return redisTemplate.opsForSet().isMember(key, value);
  717. }
  718. /**
  719. * 获取两个集合的交集
  720. *
  721. * @param key
  722. * @param otherKey
  723. * @return
  724. */
  725. public static Set<String> sIntersect(String key, String otherKey) {
  726. return redisTemplate.opsForSet().intersect(key, otherKey);
  727. }
  728. /**
  729. * 获取key集合与多个集合的交集
  730. *
  731. * @param key
  732. * @param otherKeys
  733. * @return
  734. */
  735. public static Set<String> sIntersect(String key, Collection<String> otherKeys) {
  736. return redisTemplate.opsForSet().intersect(key, otherKeys);
  737. }
  738. /**
  739. * key集合与otherKey集合的交集存储到destKey集合中
  740. *
  741. * @param key
  742. * @param otherKey
  743. * @param destKey
  744. * @return
  745. */
  746. public static Long sIntersectAndStore(String key, String otherKey, String destKey) {
  747. return redisTemplate.opsForSet().intersectAndStore(key, otherKey,
  748. destKey);
  749. }
  750. /**
  751. * key集合与多个集合的交集存储到destKey集合中
  752. *
  753. * @param key
  754. * @param otherKeys
  755. * @param destKey
  756. * @return
  757. */
  758. public static Long sIntersectAndStore(String key, Collection<String> otherKeys,
  759. String destKey) {
  760. return redisTemplate.opsForSet().intersectAndStore(key, otherKeys,
  761. destKey);
  762. }
  763. /**
  764. * 获取两个集合的并集
  765. *
  766. * @param key
  767. * @param otherKeys
  768. * @return
  769. */
  770. public static Set<String> sUnion(String key, String otherKeys) {
  771. return redisTemplate.opsForSet().union(key, otherKeys);
  772. }
  773. /**
  774. * 获取key集合与多个集合的并集
  775. *
  776. * @param key
  777. * @param otherKeys
  778. * @return
  779. */
  780. public static Set<String> sUnion(String key, Collection<String> otherKeys) {
  781. return redisTemplate.opsForSet().union(key, otherKeys);
  782. }
  783. /**
  784. * key集合与otherKey集合的并集存储到destKey中
  785. *
  786. * @param key
  787. * @param otherKey
  788. * @param destKey
  789. * @return
  790. */
  791. public static Long sUnionAndStore(String key, String otherKey, String destKey) {
  792. return redisTemplate.opsForSet().unionAndStore(key, otherKey, destKey);
  793. }
  794. /**
  795. * key集合与多个集合的并集存储到destKey中
  796. *
  797. * @param key
  798. * @param otherKeys
  799. * @param destKey
  800. * @return
  801. */
  802. public static Long sUnionAndStore(String key, Collection<String> otherKeys,
  803. String destKey) {
  804. return redisTemplate.opsForSet().unionAndStore(key, otherKeys, destKey);
  805. }
  806. /**
  807. * 获取两个集合的差集
  808. *
  809. * @param key
  810. * @param otherKey
  811. * @return
  812. */
  813. public static Set<String> sDifference(String key, String otherKey) {
  814. return redisTemplate.opsForSet().difference(key, otherKey);
  815. }
  816. /**
  817. * 获取key集合与多个集合的差集
  818. *
  819. * @param key
  820. * @param otherKeys
  821. * @return
  822. */
  823. public static Set<String> sDifference(String key, Collection<String> otherKeys) {
  824. return redisTemplate.opsForSet().difference(key, otherKeys);
  825. }
  826. /**
  827. * key集合与otherKey集合的差集存储到destKey中
  828. *
  829. * @param key
  830. * @param otherKey
  831. * @param destKey
  832. * @return
  833. */
  834. public static Long sDifference(String key, String otherKey, String destKey) {
  835. return redisTemplate.opsForSet().differenceAndStore(key, otherKey,
  836. destKey);
  837. }
  838. /**
  839. * key集合与多个集合的差集存储到destKey中
  840. *
  841. * @param key
  842. * @param otherKeys
  843. * @param destKey
  844. * @return
  845. */
  846. public static Long sDifference(String key, Collection<String> otherKeys,
  847. String destKey) {
  848. return redisTemplate.opsForSet().differenceAndStore(key, otherKeys,
  849. destKey);
  850. }
  851. /**
  852. * 获取集合所有元素
  853. *
  854. * @param key
  855. * @return
  856. */
  857. public static Set<String> setMembers(String key) {
  858. return redisTemplate.opsForSet().members(key);
  859. }
  860. /**
  861. * 随机获取集合中的一个元素
  862. *
  863. * @param key
  864. * @return
  865. */
  866. public static String sRandomMember(String key) {
  867. return redisTemplate.opsForSet().randomMember(key);
  868. }
  869. /**
  870. * 随机获取集合中count个元素
  871. *
  872. * @param key
  873. * @param count
  874. * @return
  875. */
  876. public static List<String> sRandomMembers(String key, long count) {
  877. return redisTemplate.opsForSet().randomMembers(key, count);
  878. }
  879. /**
  880. * 随机获取集合中count个元素并且去除重复的
  881. *
  882. * @param key
  883. * @param count
  884. * @return
  885. */
  886. public static Set<String> sDistinctRandomMembers(String key, long count) {
  887. return redisTemplate.opsForSet().distinctRandomMembers(key, count);
  888. }
  889. /**
  890. * @param key
  891. * @param options
  892. * @return
  893. */
  894. public static Cursor<String> sScan(String key, ScanOptions options) {
  895. return redisTemplate.opsForSet().scan(key, options);
  896. }
  897. /**------------------zSet相关操作--------------------------------*/
  898. /**
  899. * 添加元素,有序集合是按照元素的score值由小到大排列
  900. *
  901. * @param key
  902. * @param value
  903. * @param score
  904. * @return
  905. */
  906. public static Boolean zAdd(String key, String value, double score) {
  907. return redisTemplate.opsForZSet().add(key, value, score);
  908. }
  909. /**
  910. * @param key
  911. * @param values
  912. * @return
  913. */
  914. public static Long zAdd(String key, Set<ZSetOperations.TypedTuple<String>> values) {
  915. return redisTemplate.opsForZSet().add(key, values);
  916. }
  917. /**
  918. * @param key
  919. * @param values
  920. * @return
  921. */
  922. public static Long zRemove(String key, Object... values) {
  923. return redisTemplate.opsForZSet().remove(key, values);
  924. }
  925. /**
  926. * 增加元素的score值,并返回增加后的值
  927. *
  928. * @param key
  929. * @param value
  930. * @param delta
  931. * @return
  932. */
  933. public static Double zIncrementScore(String key, String value, double delta) {
  934. return redisTemplate.opsForZSet().incrementScore(key, value, delta);
  935. }
  936. /**
  937. * 返回元素在集合的排名,有序集合是按照元素的score值由小到大排列
  938. *
  939. * @param key
  940. * @param value
  941. * @return 0表示第一位
  942. */
  943. public static Long zRank(String key, Object value) {
  944. return redisTemplate.opsForZSet().rank(key, value);
  945. }
  946. /**
  947. * 返回元素在集合的排名,按元素的score值由大到小排列
  948. *
  949. * @param key
  950. * @param value
  951. * @return
  952. */
  953. public static Long zReverseRank(String key, Object value) {
  954. return redisTemplate.opsForZSet().reverseRank(key, value);
  955. }
  956. /**
  957. * 获取集合的元素, 从小到大排序
  958. *
  959. * @param key
  960. * @param start 开始位置
  961. * @param end 结束位置, -1查询所有
  962. * @return
  963. */
  964. public static Set<String> zRange(String key, long start, long end) {
  965. return redisTemplate.opsForZSet().range(key, start, end);
  966. }
  967. /**
  968. * 获取集合元素, 并且把score值也获取
  969. *
  970. * @param key
  971. * @param start
  972. * @param end
  973. * @return
  974. */
  975. public static Set<ZSetOperations.TypedTuple<String>> zRangeWithScores(String key, long start,
  976. long end) {
  977. return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
  978. }
  979. /**
  980. * 根据Score值查询集合元素
  981. *
  982. * @param key
  983. * @param min 最小值
  984. * @param max 最大值
  985. * @return
  986. */
  987. public static Set<String> zRangeByScore(String key, double min, double max) {
  988. return redisTemplate.opsForZSet().rangeByScore(key, min, max);
  989. }
  990. /**
  991. * 根据Score值查询集合元素, 从小到大排序
  992. *
  993. * @param key
  994. * @param min 最小值
  995. * @param max 最大值
  996. * @return
  997. */
  998. public static Set<ZSetOperations.TypedTuple<String>> zRangeByScoreWithScores(String key,
  999. double min, double max) {
  1000. return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max);
  1001. }
  1002. /**
  1003. * @param key
  1004. * @param min
  1005. * @param max
  1006. * @param start
  1007. * @param end
  1008. * @return
  1009. */
  1010. public static Set<ZSetOperations.TypedTuple<String>> zRangeByScoreWithScores(String key,
  1011. double min, double max, long start, long end) {
  1012. return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max,
  1013. start, end);
  1014. }
  1015. /**
  1016. * 获取集合的元素, 从大到小排序
  1017. *
  1018. * @param key
  1019. * @param start
  1020. * @param end
  1021. * @return
  1022. */
  1023. public static Set<String> zReverseRange(String key, long start, long end) {
  1024. return redisTemplate.opsForZSet().reverseRange(key, start, end);
  1025. }
  1026. /**
  1027. * 获取集合的元素, 从大到小排序, 并返回score值
  1028. *
  1029. * @param key
  1030. * @param start
  1031. * @param end
  1032. * @return
  1033. */
  1034. public static Set<ZSetOperations.TypedTuple<String>> zReverseRangeWithScores(String key,
  1035. long start, long end) {
  1036. return redisTemplate.opsForZSet().reverseRangeWithScores(key, start,
  1037. end);
  1038. }
  1039. /**
  1040. * 根据Score值查询集合元素, 从大到小排序
  1041. *
  1042. * @param key
  1043. * @param min
  1044. * @param max
  1045. * @return
  1046. */
  1047. public static Set<String> zReverseRangeByScore(String key, double min,
  1048. double max) {
  1049. return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max);
  1050. }
  1051. /**
  1052. * 根据Score值查询集合元素, 从大到小排序
  1053. *
  1054. * @param key
  1055. * @param min
  1056. * @param max
  1057. * @return
  1058. */
  1059. public static Set<ZSetOperations.TypedTuple<String>> zReverseRangeByScoreWithScores(
  1060. String key, double min, double max) {
  1061. return redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key,
  1062. min, max);
  1063. }
  1064. /**
  1065. * @param key
  1066. * @param min
  1067. * @param max
  1068. * @param start
  1069. * @param end
  1070. * @return
  1071. */
  1072. public static Set<String> zReverseRangeByScore(String key, double min,
  1073. double max, long start, long end) {
  1074. return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max,
  1075. start, end);
  1076. }
  1077. /**
  1078. * 根据score值获取集合元素数量
  1079. *
  1080. * @param key
  1081. * @param min
  1082. * @param max
  1083. * @return
  1084. */
  1085. public static Long zCount(String key, double min, double max) {
  1086. return redisTemplate.opsForZSet().count(key, min, max);
  1087. }
  1088. /**
  1089. * 获取集合大小
  1090. *
  1091. * @param key
  1092. * @return
  1093. */
  1094. public static Long zSize(String key) {
  1095. return redisTemplate.opsForZSet().size(key);
  1096. }
  1097. /**
  1098. * 获取集合大小
  1099. *
  1100. * @param key
  1101. * @return
  1102. */
  1103. public static Long zZCard(String key) {
  1104. return redisTemplate.opsForZSet().zCard(key);
  1105. }
  1106. /**
  1107. * 获取集合中value元素的score值
  1108. *
  1109. * @param key
  1110. * @param value
  1111. * @return
  1112. */
  1113. public static Double zScore(String key, Object value) {
  1114. return redisTemplate.opsForZSet().score(key, value);
  1115. }
  1116. /**
  1117. * 移除指定索引位置的成员
  1118. *
  1119. * @param key
  1120. * @param start
  1121. * @param end
  1122. * @return
  1123. */
  1124. public static Long zRemoveRange(String key, long start, long end) {
  1125. return redisTemplate.opsForZSet().removeRange(key, start, end);
  1126. }
  1127. /**
  1128. * 根据指定的score值的范围来移除成员
  1129. *
  1130. * @param key
  1131. * @param min
  1132. * @param max
  1133. * @return
  1134. */
  1135. public static Long zRemoveRangeByScore(String key, double min, double max) {
  1136. return redisTemplate.opsForZSet().removeRangeByScore(key, min, max);
  1137. }
  1138. /**
  1139. * 获取key和otherKey的并集并存储在destKey中
  1140. *
  1141. * @param key
  1142. * @param otherKey
  1143. * @param destKey
  1144. * @return
  1145. */
  1146. public static Long zUnionAndStore(String key, String otherKey, String destKey) {
  1147. return redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey);
  1148. }
  1149. /**
  1150. * @param key
  1151. * @param otherKeys
  1152. * @param destKey
  1153. * @return
  1154. */
  1155. public static Long zUnionAndStore(String key, Collection<String> otherKeys,
  1156. String destKey) {
  1157. return redisTemplate.opsForZSet()
  1158. .unionAndStore(key, otherKeys, destKey);
  1159. }
  1160. /**
  1161. * 交集
  1162. *
  1163. * @param key
  1164. * @param otherKey
  1165. * @param destKey
  1166. * @return
  1167. */
  1168. public static Long zIntersectAndStore(String key, String otherKey,
  1169. String destKey) {
  1170. return redisTemplate.opsForZSet().intersectAndStore(key, otherKey,
  1171. destKey);
  1172. }
  1173. /**
  1174. * 交集
  1175. *
  1176. * @param key
  1177. * @param otherKeys
  1178. * @param destKey
  1179. * @return
  1180. */
  1181. public static Long zIntersectAndStore(String key, Collection<String> otherKeys,
  1182. String destKey) {
  1183. return redisTemplate.opsForZSet().intersectAndStore(key, otherKeys,
  1184. destKey);
  1185. }
  1186. /**
  1187. * @param key
  1188. * @param options
  1189. * @return
  1190. */
  1191. public static Cursor<ZSetOperations.TypedTuple<String>> zScan(String key, ScanOptions options) {
  1192. return redisTemplate.opsForZSet().scan(key, options);
  1193. }
  1194. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/511165
推荐阅读
相关标签
  

闽ICP备14008679号