@Override
public void sendCode(String phone) {
// 通过正则判断手机号的合法性
if (!phone.matches("^1[3-9]\\d{9}$")) {
throw new RuntimeException("请输入合法的手机号");
}
// 判断3次
// String.format("code:%s", phone)
String numKey = String.format(RedisKeyEnum.KEY_CODE_NUM.getKey(), phone);
// 思考题:判断10分钟三次的逻辑,在高并发情况下有问题,如何解决?lua脚本
// 判断key是否存在
if (RedisUtils.hasKey(numKey)) {
// 自增后直接获取自增后的值
Long newValue = RedisUtils.incrValue(numKey, 1L);
if (newValue > 3) {
throw new RuntimeException("10分钟内最多发送3次验证码,请稍后再试");
}
} else {
// 如果key不存在,创建key
RedisUtils.setValueTimeout(numKey, 1, RedisKeyEnum.KEY_CODE_NUM.getTimeout());
}
// 生成验证码
String code = RandomUtil.randomNumbers(4);
// 将验证码存入redis,考虑类型和key值
String key = String.format(RedisKeyEnum.KEY_CODE.getKey(), phone);
RedisUtils.setValueTimeout(key, code, RedisKeyEnum.KEY_CODE.getTimeout());
// 异步发送短信(线程、mq)
threadPoolExecutor.execute(() -> {
// 发送短信
AliSmsUtils.sendSms(
SmsEnum.SMS_CODE.getSignName(),
SmsEnum.SMS_CODE.getTemplateCode(),
phone, code);
});
}
短信发送业务
200不是二百2024-11-26 10:54
相关推荐
古法安卓4 小时前
Android-日志系统源码解析小夏coding6 小时前
从"一把梭"到"精妙拆解" —— 滑动窗口计时框架的设计演进MacroZheng7 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"十年Java程序媛8 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套xiaoqiMikko8 小时前
有人在搜一个不存在的 Tomcat 版本用户31268748772012 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronizedvipxieliang12 小时前
ValidX vs Apache Commons Validator:功能与性能对比SimonKing12 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化吃饱了得干活12 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式lhldsg14 小时前
AI零售系统实战指南:从架构设计到落地部署全解析