方案一:redis+token
单独提供一个获取token的接口(生成随机token后写入redis),前端每次请求业务接口时,先调用获取token的接口拿到token,然后带着token去请求业务接口,业务中判断,如果redis中存在此token的话,那就删除,正常执行业务。如果没有的话证明已经执行过一次了,属于重复请求。
注意:1,del时要判断如果del结果返回-1,证明删除失败,已经被其他请求过了,属于重复请求
2,用户不刷新页面不获取新token(无论前后端生成的token),这样可以cover住大部分场景。
方案二:分布式锁
接口参数 + session敏感信息拼接成lock key ,setnx 成功,执行业务逻辑,然后释放(比对随机生成的lock value),sexnx失败,那就是重复请求。
方案三:数据库唯一索引
问题待定:
Gavin.Lee:
用token方式去做的话,select token is exist 接着就得del,然后判断del 返回。用分布式锁的执行完业务以后再去释放lock
Gavin.Lee:
如果用token方式做幂等,重试的话每次重试只需要生成不同的token请求即可???