@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
相关推荐
小小菜鸡ing15 分钟前
pymysqlgetapi18 分钟前
shareId 的产生与传递链路w2sfot1 小时前
Passing Arguments as an Object in JavaScript郝学胜-神的一滴1 小时前
避免使用非const全局变量:C++中的最佳实践 (C++ Core Guidelines)我没想到原来他们都是一堆坏人1 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件搞一搞汽车电子1 小时前
S32K3平台eMIOS 应用说明沙二原住民1 小时前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控Jerry&Grj2 小时前
SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践没有bug.的程序员2 小时前
Redis Stream:轻量级消息队列深度解析总有刁民想爱朕ha2 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)