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