不用 redis 分布式锁, 如何防止用户重复点击?
业务背景
- 场景:业务订单提交系统
- 用户行为:用户页面点击「提交订单」按钮后,因网络延迟或误操作多次点击,导致同一订单被重复提交至后端。
- 核心问题:系统并未引入Redis。如何在不依赖Redis分布式锁的情况下,确保同一用户对同一订单的重复请求仅执行一次,避免超卖或脏数据。
回答
-
前端按钮置灰:
用户点击后禁用按钮,限制重复操作,但存在用户绕过置灰的情况。
-
Token 机制:
用户访问页面时后端生成 Token,提交时携带 Token。
服务端通过数据库(悲观锁 / 乐观锁)验证 Token 是否已使用,未使用则允许操作。
以下就是一个,通过token来进行订单防重复的一个具体的交互图:
-
滑动窗口限流:
控制单位时间内(如 1 分钟 / 1 秒)用户请求次数,限制重复点击频率。
-
布隆过滤器:
快速校验操作是否执行过,
如果,未命中时,则执行;
如果,命中时,再通过数据库幂等判断,实现快速失败校验。
-
参考框架方案:
可以了解下 ruoyi 框架,
校验表单信息并存储,若重复提,交且时间间隔不足,拒绝请求。
推荐方案
- 核心业务(如订单提交):后端采用 唯一ID + 数据库唯一索引,结合 前端按钮置灰。