短信发送业务

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

}
相关推荐
工业互联网专业7 分钟前
基于springboot+vue的动漫交流与推荐平台
java·vue.js·spring boot·毕业设计·源码·课程设计·动漫交流与推荐平台
雷渊10 分钟前
深入分析Spring的事务隔离级别及实现原理
java·后端·面试
try again!13 分钟前
rollup.js 和 webpack
开发语言·javascript·webpack
rebel22 分钟前
Java获取excel附件并解析解决方案
java·后端
du fei24 分钟前
C# 窗体应用(.FET Framework) 线程操作方法
开发语言·c#
du fei26 分钟前
C#文件操作
开发语言·c#
并不会33 分钟前
多线程案例-单例模式
java·学习·单例模式·单线程·多线程·重要知识
数据攻城小狮子34 分钟前
Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现
java·前端·spring boot·后端·maven·intellij-idea
m0_5557629035 分钟前
struct 中在c++ 和c中用法区别
java·c语言·c++
月亮有痕迹诶37 分钟前
【C++】智能指针
开发语言·c++·c++11