@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
相关推荐
咩咩啃树皮6 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构灯澜忆梦6 小时前
GO_并发编程---定时器鱟鲥鳚7 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)-银雾鸢尾-7 小时前
C#中的StringBuilder相关方法-银雾鸢尾-7 小时前
C#中结构体与类的区别;抽象类与接口的区别大模型码小白8 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解腾渊信息科技公司9 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案爱笑的源码基地10 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存wuqingshun31415910 小时前
TCP超时重传机制是为了解决什么问题?段一凡-华北理工大学10 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?