短信发送业务

复制代码
@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);
    });

}
相关推荐
浪潮IT馆3 分钟前
Tomcat运行war包的问题分析与解决步骤
java·tomcat
ID_180079054738 分钟前
基于 Python 的 Cdiscount 商品详情 API 调用与 JSON 核心字段解析(含多规格 SKU 提取)
开发语言·python·json
悟能不能悟21 分钟前
Caused by: java.sql.SQLException: ORA-28000: the account is locked怎么处理
java·开发语言
_院长大人_43 分钟前
MyBatis Plus 分批查询优化实战:优雅地解决 IN 参数过多问题(实操)
java·mybatis
亦是远方44 分钟前
南京邮电大学使用计算机求解问题实验一(C语言简单编程练习)
c语言·开发语言·实验报告·南京邮电大学
我是哈哈hh1 小时前
【Python数据分析】Numpy总结
开发语言·python·数据挖掘·数据分析·numpy·python数据分析
Michelle80231 小时前
24大数据 14-2 函数练习
开发语言·python
qq_381454991 小时前
Python学习技巧
开发语言·python·学习
C雨后彩虹1 小时前
机器人活动区域
java·数据结构·算法·华为·面试