@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
相关推荐
Dxy12393102161 小时前
JS DES 加密详解充值内卷1 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛云和数据.ChenGuang1 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现三无少女指南2 小时前
从这里开始:Java 后端与 AI 工程的三条阅读路线香蕉大香蕉(06敬畏市场)2 小时前
MySQL 单点详解(07)nice_lcj5202 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)骑着蜗牛撵大象3273 小时前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治tryxr3 小时前
JVM 垃圾回收机制揣一尾游鱼yu4 小时前
Spring上(IOC)笔记荣码4 小时前
长上下文与大文档处理:200页PDF怎么喂给AI,我踩了4个坑