短信发送业务

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

}
相关推荐
武子康2 分钟前
Java-168 Neo4j CQL 实战:WHERE、DELETE/DETACH、SET、排序与分页
java·开发语言·数据库·python·sql·nosql·neo4j
Filotimo_3 分钟前
SpringBoot3入门
java·spring boot·后端
通往曙光的路上15 分钟前
SpringIOC-注解
java·开发语言
闲人编程16 分钟前
Python与大数据:使用PySpark处理海量数据
大数据·开发语言·分布式·python·spark·codecapsule·大规模
一 乐25 分钟前
校园墙|校园社区|基于Java+vue的校园墙小程序系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·小程序
TT哇25 分钟前
【面经 每日一题】面试题16.25.LRU缓存(medium)
java·算法·缓存·面试
青云交26 分钟前
Java 大视界 -- 基于 Java 的大数据联邦学习在跨行业数据协同创新中的实践突破
java·分布式计算·隐私保护·apache flink·大数据联邦学习·跨行业数据协同·安全通信
合作小小程序员小小店27 分钟前
桌面开发,在线%考试管理%系统,基于eclipse,java,swing,mysql数据库。
java·数据库·mysql·eclipse·jdk
T.Ree.29 分钟前
汇编_读写内存
开发语言·汇编·c#
oioihoii31 分钟前
C/C++混合项目中的头文件管理:.h与.hpp的分工与协作
java·c语言·c++