业务设计---不用redis分布式锁, 如何防止用户重复点击?

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

当不让使用redis分布式锁,或者集群不可用的时候,如何做到防止用户重复点击的功能呢?

有以下几个思路可以供大家参考:

1、前端需要做一些按钮置灰

1、首先就是前端需要做一些按钮置灰的动作,让用户点击一次之后,按钮就直接禁用调,让用户无法重复点击。但是有些情况可能没来得及置灰就重复点击了,或者有些用户自己绕过了置灰也可以点击。

2、token的机制避免重复提交

2、可以通过token的机制避免重复提交,当用户访问页面的时候,请求后端服务拿到一个token,然后下一次接口点击的时候把token带过来,服务端对token进行验证,验证该token是否被使用过,如果没有被使用过才可以进行点击。验证的逻辑可以放在数据库中,通过数据库的悲观锁或者乐观锁都可以实现。

比如,以下就是我自己的项目中,通过token来进行订单防重复的一个具体的交互图:

3、滑动窗口限流

滑动窗口限流,滑动窗口限流是一种流量控制策略,用于控制在一定时间内允许执行的操作数量或请求频率。我们可以限制一分钟或者一秒钟内用户只能发起一次请求来防止重复点击。

4、布隆过滤器

可以使用布隆过滤器,他可以快速判断某个元素是否存在于集合中。可以在服务器端使用布隆过滤器记录某个操作是否已经被执行过,从而防止重复执行。

如果布隆过滤器不存在,则一定不存在,所以,如果没查到,说明一定没有幂等操作,直接执行就行了。

如果查询布隆过滤器发现有命中,则需要在服务数据库做一次幂等判断。

大多数情况下,需要幂等的情况占比小,所以可以用布隆过滤器做一次fail-fast的快速校验。

Redis其实也是一个集中式的存储服务,在特殊情况下,如果无法使用,一般的做法都是降级成直接使用数据库。

参考 ruoyi

5、还有种方式,那就是参考 ruoyi 框架中的防重复提交的实现方案,其实就是把表单信息做校验并保存在 REDIS 中,下次再提交的时候做校验,如果和上次提交的内容一样,并且时间小于一定的时间间隔,则拒绝请求

相关推荐
ai_xiaogui15 分钟前
PanelAI项目实战:从AI一键生成到企业级AI基础设施操作系统PPT手搓复盘与架构落地
人工智能·架构·一键部署·panelai·企业级ai基础设施操作系统·ai智能底层操作系统·算力变现
Dawson Zhu25 分钟前
【Runtime推理引擎①】Runtime架构设计:从Session到Graph Executor的完整骨架
人工智能·语言模型·架构·aigc·agi
郝学胜-神的一滴33 分钟前
AI 编程智能体 20:技术栈选型与架构落地全攻略
人工智能·python·架构·langchain·1024程序员节·智能体
microrain40 分钟前
跟着一条属性报文走一遍 SagooIoT 的接入链路
物联网·架构·golang·sagooiot
环境栈笔记42 分钟前
指纹浏览器安卓怎么用?从运行位置到功能验收,先把三种方案分清
前端·人工智能·后端·自动化
CodeGL1 小时前
微服务框架——go-zero
微服务·架构·golang
ccbw161 小时前
CH9444X多芯片组合的通道扩展架构与损耗叠加分析
驱动开发·架构·带宽·采集
Decay__1 小时前
01_MySQL 体系架构全解 —— 连接层、SQL 层、存储引擎层与 InnoDB 深入
运维·数据库·sql·mysql·架构
小小张说故事1 小时前
Python 的 list 为什么能装下任何类型?拆开 PyObject* 数组,以及它让你多付了多少内存
后端·python
ai_coder_ai2 小时前
六边形架构(端口适配器架构)的设计与实践*
架构