不用Redis分布式锁?如何防止用户重复点击的解决方案!

107 阅读1分钟

不用 redis 分布式锁, 如何防止用户重复点击?

业务背景

  1. 场景:业务订单提交系统
  2. 用户行为:用户页面点击「提交订单」按钮后,因网络延迟或误操作多次点击,导致同一订单被重复提交至后端。
  3. 核心问题:系统并未引入Redis。如何在不依赖Redis分布式锁的情况下,确保同一用户对同一订单的重复请求仅执行一次,避免超卖或脏数据。

回答

  1. 前端按钮置灰

    用户点击后禁用按钮,限制重复操作,但存在用户绕过置灰的情况。

  2. Token 机制

    用户访问页面时后端生成 Token,提交时携带 Token。

    服务端通过数据库(悲观锁 / 乐观锁)验证 Token 是否已使用,未使用则允许操作。

    以下就是一个,通过token来进行订单防重复的一个具体的交互图:

    image-20250331231345957

  3. 滑动窗口限流

    控制单位时间内(如 1 分钟 / 1 秒)用户请求次数,限制重复点击频率。

  4. 布隆过滤器

    快速校验操作是否执行过,

    如果,未命中时,则执行;

    如果,命中时,再通过数据库幂等判断,实现快速失败校验。

    Java 八股/22-高性能、高可用、高并发/布隆过滤器是什么?实现原理是什么?.md

  5. 参考框架方案

    可以了解下 ruoyi 框架,

    校验表单信息并存储,若重复提,交且时间间隔不足,拒绝请求。

推荐方案
  1. 核心业务(如订单提交):后端采用 唯一ID + 数据库唯一索引,结合 前端按钮置灰。