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

使用Redis 分布式锁防止短信验证码重复下发问题

发送短信验证码是大多数产品的常见功能,但也常发生“重复下发”问题:用户或客户端多次触发发送接口(误点、重试、网络抖动、并发线程、爬虫/攻击)导致同一手机号短时间内收到多条验证码,从而浪费费用、影响用户体验,甚至触发短信渠道限流。本文聚焦一种简单高效的工程方案:基于 Redis 的分布式锁,并从设计思路、实现要点、性能/复杂度分析、常见坑与解决方案以及测试/监控建议等方面给出实践级指导与代码示例。


一、问题拆解与目标

目标:在保持较好用户体验(及时返回)的同时,避免在短时间内对同一手机号重复下发验证码,并保证系统在分布式部署下的正确性与可恢复性。

常见触发场景:

  • 用户多次点击“发送验证码”按钮(误点/网络慢导致重试)。

  • 短时间内并发请求(前端并发、并发任务、爬虫)。

  • 第三方 SDK 重试或回调重复请求。

设计约束:

  • 必须在分布式环境下工作(多台应用实例)。

  • 要快速失败或快速返回(不能长时间阻塞客户端)。

  • 要有清晰的超时/失败恢复策略,避免死锁或永久“占用”。


二、总体方案(思路)

对同一业务键(通常是 phonephone+bizType)在 Redis 上加短周期分布式锁。流程:

  1. 请求到来,计算锁 key(例如 lock:sms:{biz}:{phone})。

  2. 尝试加锁(SET NX + EXPIRE 或 Redisson 等库)。

  3. 若获取锁失败:返回“处理中/已发送/请稍后”或直接拒绝(依业务决定)。

  4. 若获取锁成功:在锁保护范围内检查发送频率/黑名单/缓存的最近发送时间;如满足发送条件则调用 SMS 渠道发送,并记录发送时间(缓存或 DB);最后释放锁。

  5. 保证锁安全释放(只有持有者可以释放),并设计锁 TTL/续租与异常恢复机制(IN_PROGRESS 超时清理等)。

该方案更多是「短粒度串行化」——把同一手机号的并发发送请求序列化,而不是给整系统串行化。


三、Redis 锁的实现要点

1) 简单实现(SET NX + EX)

SET lockKey lockValue NX PX 30000
  • lockKey

http://www.dtcms.com/a/340317.html

相关文章:

  • 《防雷电路设计》---TVS介绍
  • Linux系统之部署nullboard任务管理工具
  • C++/Qt开发:TCP通信连接软件测试方法:ECHO指令
  • C++中的原子操作,自旋锁
  • Vibe Coding:轻松的幻觉,沉重的未来
  • HTML <meta name=“color-scheme“>:自动适配系统深色 / 浅色模式
  • AutoGLM2.0背后的云手机和虚拟机分析(非使用案例)
  • Mac 4步 安装 Jenv 管理多版本JDK
  • 基于YOLO11的手机违规使用检测模型训练实战
  • MySQL诊断系列(3/6):索引分析——5个SQL揪出“僵尸索引”
  • Docker Compose命令一览(Docker Compose指令、docker-compose命令)
  • 动态规划----8.乘积最大子数组
  • 遥感机器学习入门实战教程|Sklearn 案例④ :多分类器对比(SVM / RF / kNN / Logistic...)
  • 详解 scikit-learn 数据预处理工具:从理论到实践
  • 5.4 4pnpm 使用介绍
  • 给你的Unity编辑器添加实现类似 Odin 的 条件显示字段 (ShowIf/HideIf) 功能
  • Scikit-learn 预处理函数分类详解
  • pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。
  • 在 React 中,​父子组件之间的通信(传参和传方法)
  • scikit-learn/sklearn学习|变量去中心化和标准化
  • 2.3 Flink的核心概念解析
  • 详解flink java table api基础(三)
  • Flink Stream API - 顶层Operator接口StreamOperator源码超详细讲解
  • OSPF 典型组网
  • CISP-PTE之路--10文
  • 公有地址和私有地址
  • 【GPT入门】第51课 将hf模型转换为GGUF
  • 深入(流批【牛批】框架)Flink的机制
  • 【Java后端】Spring Boot 全局异常处理最佳实践
  • ssl代理