2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 幂等性的解决方案

幂等性的解决方案

时间:2021-10-04 09:28:05

相关推荐

幂等性的解决方案

1. 什么是幂等性

用户对同一操作发起一次请求和多次请求的结果是一致的。不会因为多次点击而产生了副作用。比如点击支付,多次点击只会扣款一次。

2. 哪些情况需要防止

用户多次点击按钮用户页面回退再次提交

3. 幂等解决方案

3.1 token机制

当客户端进入订单提交页时,会向服务器申请一个token,服务器同时也会将这个token保存在redis中。客户端在页面加载的时候,将token放在隐藏域中保存。客户端点击按钮提交订单时,把token携带过去,一般放在请求头部服务器判断token是否存在redis中,存在表示为第一次请求,然后先删除token,继续执行业务如果判断token不存在redis中,则表示为重复操作,直接返回重复标记给客户端。这样保证了业务代码不会被重复执行。先删除token,再执行业务逻辑,中间如果出现宕机,可能会导致业务调用失败,对于这种情况,大不了就重新获取token再次请求token的获取,比较和删除必须整体是原子性的,这个可以在redis中使用lua脚本来完成

3.2 利用锁机制

利用数据库的悲观锁(效率不高)利用数据库的乐观锁(加一个版本号字段,每次更新先验证版本号是否符合预期)业务层采用分布式锁(先加分布式锁,再判断是否数据已被处理,处理完成再释放锁)

3.3 利用各种唯一性约束

数据库的唯一性约束 插入数据,按照唯一索引进行插入,比如以订单号为主键进行插入数据。但如果要是分库分表,需要有路由规则保证相同请求下,会落地到同一个数据库的同一表中,因为数据库的主键约束是在数据库表层面上的,不能跨表约束。redis set防重 可以将处理完的数据的id或者唯一性标识存入redis中,每次处理数据时,先查看是否redis中是否存在,存在则不处理。同理还是要考虑redis比较、添加的操作整体是原子性。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。