总所周知,GET请求是天然幂等的,多次GET操作,结果是一致的。
POST请求在生产型项目中也要保持幂等,比如支付时的POST请求,如果不幂等,可能会出现重新支付的情况;注册用户时的POST请求,如果不是幂等的,可能会产生重复用户。
幂等性:即多次操作,返回的结果是一致的,保持接口幂等性,才能保证数据安全,不重复,不混乱;
做到接口幂等,不仅仅是为了防止单个用户重复点击,在高并发的时候它的作用显得更加重要。
如何做到接口幂等?
0.基本要求:业务逻辑层数据状态的校验。比如支付前校验订单状态,注册用户前校验用户是否已存在,这个是和具体业务逻辑相关的校验。
1.高并发情况下的幂等性:
高并发情况下的幂等性,一般要使用锁,有以下三种思路:
1.1数据库悲观锁:对业务逻辑数据状态的校验,在查询的时候使用select ......for update,,注意结合@Transactional注解使用才能生效(效率低,不推荐)
1.2JUC包中的锁:使用ReentrantLock锁,根据订单号,用户名等等进行加锁,避免重复请求(只适合单机,不推荐)
1.3分布式锁:现在大多数项目都是分布式项目,这种情况下必须使用分布式锁,redis或者zookeeper这种分布式锁都能很好的实现幂等性。(推荐)
做到接口幂等性,前端也可以做一些工作,比如点击一次之后,按钮置灰,在一定程度上可以减少重复点击,但是后端的接口幂等性是万万少不了的。