当前位置: 首页 > article >正文

短信发送业务

@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);
    });

}

http://www.kler.cn/a/412169.html

相关文章:

  • Vue 3 中 onUnload 和 onPageScroll 使用详解
  • Flink中普通API的使用
  • R和Julia免疫细胞映射到组织切片
  • 【前端】ES6基础
  • 深度学习——3种常见的Transformer位置编码【sin/cos、基于频率的二维位置编码(2D Frequency Embeddings)、RoPE】
  • 网络协议——BGP(边界网关协议)全网最详解
  • 0基础学前端系列 -- 深入理解 HTML 布局
  • DB-GPT V0.6.2 版本更新:牵手libro社区、GraphRAG图谱构建能力增强等
  • 基于springboot停车场管理系统源码和论文
  • k8s删除网络组件错误
  • 实验3-2
  • QT实现 倒计时猜数字小游戏 QT5.12.3环境 C++实现
  • 【Threejs进阶教程-着色器篇】9.顶点着色器入门
  • 大语言模型LLM的微调代码详解
  • Flask项目中PostgreSQL与Elasticsearch的批量更新
  • LLM PPT Translator
  • 笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
  • BC-Linux8.6上面离线手动安装Docker引擎
  • 使用docker搭建hysteria2服务端
  • 类文件结构详解.下
  • Qt | 开发技能提升档次哈
  • GoogleTest做单元测试
  • [小白系列]Ubuntu安装教程-安装NodeJS
  • k8s认证、授权
  • C#基础56-60
  • unity使用笔记