041-若依pro(ruoyi-vue-pro)幂等性(防重复提交)
yudao-spring-boot-starter-protection技术组件,由它的 idempotent 包,提供声明式的幂等特性,可防止重复请求。例如说,用户快速的双击了某个按钮,前端没有禁用该按钮,导致发送了两次重复的请求。
yudao-spring-boot-starter-protection 技术组件,由它的 idempotent 包,提供声明式的幂等特性,可防止重复请求。例如说,用户快速的双击了某个按钮,前端没有禁用该按钮,导致发送了两次重复的请求。
实现原理
它的实现原理非常简单,针对相同参数的方法,一段时间内,有且仅能执行一次。执行流程如下:
① 在方法执行前,根据参数对应的 Key 查询是否存在。
如果存在,说明正在执行中,则进行报错。
如果不在,则计算参数对应的 Key,存储到 Redis 中,并设置过期时间,即标记正在执行中。
默认参数的 Redis Key 的计算规则由 DefaultIdempotentKeyResolver 实现,使用 MD5(方法名 + 方法参数),避免 Redis Key 过长。
② 方法执行完成,不会主动删除参数对应的 Key。
如果希望会主动删除 Key,可以使用 《开发指南 —— 分布式锁》 提供的 @Lock 来实现幂等性。
从本质上来说,idempotent 包提供的幂等特性,本质上也是基于 Redis 实现的分布式锁。
③ 如果方法执行时间较长,超过 Key 的过期时间,则 Redis 会自动删除对应的 Key。因此,需要大概评估下,避免方法的执行时间超过过期时间。
@Idempotent 注解
声明在方法上,表示该方法需要开启幂等性
对应的 AOP 切面是 IdempotentAspect 类
对应的 Redis Key 的前缀是 idempotent:%s,可见 IdempotentRedisDAO 类
更多推荐
所有评论(0)