目录
当不让使用redis分布式锁,或者集群不可用的时候,如何做到防止用户重复点击的功能呢?
一、按钮变灰
首先就是前端需要做一些按钮置灰的动作,让用户点击一次之后,按钮就直接禁用掉,让用户无法重复点击。但是有些情况可能来不及置灰就重复点击了,或者有些用户自己绕过了置灰也可以点击。
二、利用Token
可以通过token的机制避免重复提交,当用户访问页面的时候,请求后端服务拿到一个token,然后下一次接口点击的时候把token带过来,服务器对token进行验证,验证该token是否被使用过,如果没有被使用过才可以进行点击。验证的逻辑可以在数据库中,通过数据库的悲观锁或者乐观锁都可以实现。
三、滑动窗口限流
滑动窗口限流,滑动窗口限流是一种流量控制策略,用于控制在一定时间内允许执行的操作数量或请求频次。 我们可以限制一分钟或者一秒钟内用户只能发起一次请求来防止重复点击。
那么什么是滑动窗口限流呢?
滑动窗口限流是一种流量控制策略,用于控制在一定时间内允许执行的操作数量或请求频次。它的 工作方式类似于一个滑动时间窗口,在窗口内允许的操作数量是固定的,窗口会随着时间的推移不断滑动。
首先需要把时间划分成多个连续的时间片段,每一个片段都有一个固定的时间间隔,如1s,1h等。
然后再定义一个时间窗口,比如10s。随着时间的推移,这个窗口不断的向右移动。为了实现限流的功能,我们通常需要定义一个计数器,统计时间窗口内的请求数。
当前时间窗口滑动时,需要上一片时间片段的请求数对当前请求数的叠加,当有新的请求数对数据到达系统时,系统会检查窗口内的请求数是否已满,如果计数未满,请求被允许执行;如果计数已满,请求被拒绝或者进入等待队列,或执行其他限流操作。
滑动窗口限流的主要优点是可以在时间内平滑控制流量,而不是简单地设置固定的请求数速率。这使得系统可以更灵活地应对突发流量或峰值流量,而不会因为固定速率的限制而浪费资源或使系统失衡。
滑动窗口限流可以广泛的在系统、API服务、网络通信等各种应用场景中使用,以确保系统的稳定性和可用性,防止过多的请求或者操作对系统造成负担或崩溃。
四、布隆过滤器
可以使用布隆过滤器,它可以快速判断某个元素是否存在于集合中。在服务器端使用布隆过滤器记录某 个操作是否已经被执行过,从而防止重复执行。
如果布隆过滤器不存在,则一定不存在,所以,如果没查到,说明一定没有幂等操 作,直接执行就行了。 如果查询布隆过滤器发现有命中,则需要再服务数据库做一次幂等判 断。 大多数情况下,需要幂等的情况占比小,所以可以用布隆过滤器做一次 fail-fast 的快速校验。
Redis其实也是一个集中的存储服务,在特殊情况下,如果无法使用,一般的做法都是降级成直接使用数据库。
五、若依框架方式
还有种方式,那就是参考 ruoyi 框架中的防重复提交的实现方案,其实就是把表单信息做校验并保存在 REDIS 中,下次再提交的时候做校验,如果和上次提交的内容一样,并且时间小于一定的 时间间隔,则拒绝请求。