# 实际开发过程中,怎么防止接口重复提交?
这个问题涉及的知识点非常的广。解决的方案有许多。下面给出了逻辑上说的过去的方案。缺乏实战。都是停留在理论上。
# 涉及的问题
比如用户重复点击个按钮,导致重复订单创建或者重复扣费。
核心是考察接口的幂等性设计。——所谓幂等性,就是让一个接口的多次调用对数据只产生一次影响。
# 理论上的解决方案
有三种方案。
第一个,你可以利用数据库的唯一索引,一旦重复创建相同数据,就可以触发索引的冲突异常。这种适合创建类的场景。
第二个,你可以基于 Redis 来实现。用户的请求到达以后,你用业务标志加上用户 ID 来生成一个唯一的 key。通过 SETNX 命令来去尝试获得锁,获得锁成功就执行业务逻辑。
假如:用业务标志是user,用户id为:1.则:user:1就是redis的key。
user:1
1
redis的SETNX命令作用是什么?
第三个,你可以前端去携带一个唯一的ID,后端接收到以后呢,去先查缓存或者数据库,判断这个 ID 是不是已经处理过了。如果已经处理了,就直接返回结果,不重复执行。