如何解决接口数据重复问题?
1. 前端实现
前端设置按钮的状态,提交以后就加载,成功以后再恢复正常状态。
缺点:无法绝对保证不重复,但是前端实现可以减少网络请求
2. 后端通过幂等性来实现
2.1 幂等性概念
幂等指多次操作产生的影响只会跟一次执行的结果相同,通俗的说:某个行为重复的执行,最终获取的结果是相同的,不会因为重复执行对系统造成变化。(同一个接口,多次发出同一个请求,必须保证操作只执行一次)
2.2 实现幂等口诀
一锁二查三更新
2.3 幂等场景
用户下单、抽奖
2.4 实现方式
2.4.1 token方式
用户进入表单获取token,请求的时候带入token,后端判断传入的token是否存在,存在就直接提示重复,不存在存入Redis或者其他存储介质,token会有过期时间,一般5分钟
缺点:并发时候会判断到token是不存在的,还是可能造成重复提交的问题,需要加分布式锁解决
2.4.2 唯一主键或者唯一索引
这个字段是不能重复,比如用户表,用户名是不能重复,可以设置用户名为唯一索引。再比如活动表,用户id和活动id作为唯一索引
2.5 实现伪代码
一锁:先加一个分布式锁
二判:判断请求是否执行成功过
三更新:执行更新的业务逻辑