短信发送业务

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

}
相关推荐
有什么东东1 分钟前
山东大学软件学院创新项目实训开发日志(20)之中医知识问答自动生成对话标题bug修改
java·vue·bug·springboot
啊吧怪不啊吧3 分钟前
Linux常见指令介绍下(入门级)
linux·开发语言·centos
谷晓光4 分钟前
Python 中 `r` 前缀:字符串处理的“防转义利器”
开发语言·python
Tiger Z9 分钟前
R 语言科研绘图第 41 期 --- 桑基图-基础
开发语言·r语言·贴图
打死不学Java代码10 分钟前
PaginationInnerInterceptor使用(Mybatis-plus分页)
android·java·mybatis
南客先生12 分钟前
海量聊天消息处理:ShardingJDBC分库分表、ClickHouse冷热数据分离、ES复合查询方案、Flink实时计算与SpringCloud集成
java·clickhouse·elasticsearch·flink·springcloud·shardingjdbc
w236173460119 分钟前
Tomcat:从零理解Java Web应用的“心脏”
java·前端·tomcat
chuxinweihui22 分钟前
数据结构——二叉树,堆
c语言·开发语言·数据结构·学习·算法·链表
yuren_xia24 分钟前
示例:Spring JDBC编程式事务
java·后端·spring
陈大大陈39 分钟前
基于 C++ 的用户认证系统开发:从注册登录到Redis 缓存优化
java·linux·开发语言·数据结构·c++·算法·缓存