1.定义
一个接口,使用完全相同的参数调用一次的结果和调用多次后的结果完全一致。
2.解决方式
2.1保证接口自身逻辑的幂等性
就是我的接口的代码逻辑允许你使用相同的参数进行多次的调用,而不会出现任何问题。
2.1.1代码无论执行多少次都和执行一次一样
这个接口的比如就是一个update语句某一个字段为固定值的。
update table set filed =1;
这个接口啥都不用做,本身就是一个幂等的。
2.1.2 select + update/insert
例子:确认收货修改订单状态
在写这样一个接口时:首先查询订单状态,之后如果不是待收货的状态,就报错。
因此,不论确认收货几次,我只要一次执行成功就放弃其余请求的执行。
但是真的有重复请求并发过来后,这种方式基本没用,需要加锁。
2.1.3乐观锁
例子:确认收货修改订单状态
1.状态机
在update 语句执行时判断当前状态是否为待收货状态即可。这样只要有一次请求成功后,剩余请求会失败返回。
2.表字段加version
在 update 语句执行时,判断version 字段是否一致。
2.1.4 数据库主键
在生成订单,我们可以为某个订单先生成主键订单号,此后,用户提交订单,会带着订单号前来,第一次插入成功后,第二次即使有重复请求,也插入不进去。因为重复主键。
2.2通过某些手段保证请求多次但只执行一次
2.2.1按钮置灰
这样防止用户重复点击。
①但是如果有人恶意调用接口,呵呵啦
②一次请求成功但是响应丢失,前端请求超时,这时用户允许再点击一次。
③用户成功请求后,没有跳转页面。用户允许再次点击。
在网络通畅+及时的清空数据或跳转页面后,可以杜绝大多数的重复请求
2.2.2通过标识标记请求
使用token标记请求,如果已经请求过,就不然执行接口调用
①前端自己生产token,后端记录token,下次同样的token不让执行
②后端生成token给前端,用过一次后失效。下次同样token阻止
③使用一些参数去标志一个请求,指定参数字段值相同不允许重复请求
2.解决思路
3.实现技术
Redis
Spring-Aop (环绕通知)
4.重点功能
1.用户可以选择使用哪些入参作为 同一个请求的 标识。
2.用户可以对key放入redis的时间进行控制
3.用户可以自定义重复请求时的提示语