@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 小时前
【问题】代理转发到后端使用request.getRequestURL()地址没有端口言乐64 小时前
PythonLOLM自动生成复盘报告模型霸道流氓气质4 小时前
HashiCorp Vault 与云 KMS 入门实战:动态密钥、SecretLeaseContainer 与 Java 集成完整指南wuminyu4 小时前
stackChunkOop内部结构与GC屏障的配合工作原理剖析论文复现现场4 小时前
DeepSeek V4.1 Flash 各平台价格怎么比?缓存、峰谷计费与 Python 成本计算xuxigifxfh4 小时前
牛客:HJ21 简单密码小π军4 小时前
C 和 C++ 是否都支持函数的重载?sp42a4 小时前
简单的 Spring 文件上传与下载组件步行cgn4 小时前
为什么 Spring 建议使用构造器注入?Nefu_lyh4 小时前
【工作杂谈_20261012】数据平台与工程治理: Spark OOM 排查:Java Heap、Executor 与代码内存模型