短信发送业务

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

}
相关推荐
沉木渡香37 分钟前
VSCode中Java开发环境配置的三个层级(Windows版)1-3
java·windows·vscode
程序员小白条39 分钟前
度小满运维开发一面
java·运维·python·职场和发展·运维开发
Leo655356 小时前
JDK8 的排序、分组求和,转换为Map
java·开发语言
磨十三7 小时前
C++ 标准库排序算法 std::sort 使用详解
开发语言·c++·排序算法
书源丶8 小时前
二十八、API之《System 类》——与系统交互的“桥梁”
java·交互
两只程序猿8 小时前
数据可视化 | Violin Plot小提琴图Python实现 数据分布密度可视化科研图表
开发语言·python·信息可视化
Pluchon8 小时前
硅基计划4.0 算法 字符串
java·数据结构·学习·算法
野生技术架构师8 小时前
1000 道 Java 架构师岗面试题
java·开发语言
青柠编程9 小时前
基于Spring Boot的选课管理系统架构设计
java·spring boot·后端
湫兮之风9 小时前
C++: Lambda表达式详解(从入门到深入)
开发语言·c++