18. SpringBoot集成Redis(实战篇)
大约 3 分钟
一、前言🔥
环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
经过上几期的redis教学,所以现在你们应该掌握的能力有如下:
- 能独立实现springboot框架集成redis等相关配置。
- 能独立书写test-case并进行redis类方法实例测试。
- 能独立进行客户端redis基本命令操作。
- 能独立代码实现redis相关业务代码。
- ...
那我再结合具体场景,带着大家如何在业务场景中结合redis来做,我就希望在我讲的过程中,你们都能认真听讲哈!
好啦,那我要开始咯。请同学们肃静,认真听并做好笔记。
二、场景解读
结合redis实现一个手机验证码的功能。
同时手机验证码有如下4点内容要求:大家请听清楚。
- 验证码长度为六位数字。
- 一个手机号一天只能发送三次验证码机会,超过三次拒绝发送。
- 要求验证码有效期为两分钟。
- 发送验证码间隔时间为一分钟。
三、代码实现
咱们就按上边的业务要求,一步一步来。
1、获取随机获取六位数字
/**
* 随机获取六位数字
*
* @return
*/
public String getCode() {
int code = (int) ((Math.random() * 9 + 1) * 100000);
return String.valueOf(code);
}
2、获取验证码
/**
* 获取验证码,存入redis中并设置过期时间
*/
public void verifyCode(String phone) {
//1、定义手机号、验证码标识
String phoneKey = phone + "_count";
String codeKey = phone + "_code";
//2、每个号码只能发送三次
String count = redisMediator.get(phoneKey);
//3、从次数进行判断
if (count == null) {
//说明此号码第一次申请
//插入phone标识,并设置过期时间
redisMediator.set(phoneKey, "1", Long.valueOf(24 * 60 * 60));
} else if (Integer.parseInt(count) <= 2) {
//获取当前用户验证码剩余时间
long keyExpirationTime = redisMediator.getKeyExpirationTime(phoneKey);
System.out.println("keyExpirationTime:" + keyExpirationTime);
//获取当前次数
String codeCount = redisMediator.get(phoneKey);
//次数+1
int newCount = Integer.parseInt(codeCount) + 1;
redisMediator.set(phoneKey, String.valueOf(newCount), keyExpirationTime);
} else {
//当天3次机会用完了
System.out.println("当天3次机会用完了!请明日再试");
return;
}
//获取随机6位验证码
String code = this.getCode();
//验证码存入redis并设置过期时间(2min)
redisMediator.set(codeKey, code, Long.valueOf(2 * 60));
}
3、校验验证码是否正确
/**
* 校验验证码是否有效
*/
public boolean checkCode(String phone, String code) {
String codeKey = phone + "_code";
String redisCode = redisMediator.get(codeKey);
if (code.equals(redisCode)) {
return true;
}
return false;
}
其实说实话,这个逻辑很简单的,唯独就是要注意一点,就是按获取验证码次数判断,其他的都没啥。
然后解释一下,为什么我在1<=count<=3 这一层逻辑中,有查询countKey的过期时间,对吧。为什么要多此一步呢?其实啊我这是为了避免在用户下次申请的时候,又重置过期时间,那这样,就会造成有的用户在长时间无法进行短信申请,你们想想,是不是?
假如有的用户在据上一次申请操作很久之后又进行了第二次申请(但这是countKey还未过期),那该用户的count值进行+1,如果过期时间被重置,那么这位用户就得要再等24个小时才能再次验证码申请,对吧?这不反人类操作么。所以这点,你们也注意一下咯。