如何防止订单重复
在整个下单流程中,哪里重复操作影响最大?确认订单只是修改订单状态从未支付改为待支付而已,不会对我们的主要业务产生影响,而在支付的时候,主要由第三方平台,我们也可以不用管,主要重复操作影响最大的还是在用户下单的这个过程。
若网络堵塞时点击了很多次,那订单服务就会生成多个订单信息,即使只有一个消息有效,其他请求也是对我们系统造成了资源的浪费,对用户体验也很差,有多个订单信息。
一种方式可以通过前端点击下单后,按钮置灰,也就是不可点。但这种只能防止正常用户,用户实际可以绕过前端进行操作,所以后端也必须做相应处理。
可以通过redis的setNX来保证唯一幂等性,setNX的作用是保存Key,Value时,当Value值为空,就可以正常保存返回true,这样就能保证多次操作只能存储一次值,其他操作都会失败。
当然还需要设置过期时间,比如3-5秒,用户一般不会重复提交订单,有也是恶意的,(超过过期时间,就可以再次下单)
关键还是需要怎样的Key去保证这样的幂等性,可以通过用户Token+商品URL+指定key为键,保证当前用户,当前商品,还可以加个指定Key,因为可能这个页面也有其他业务(也就是非下单操作)需要保证幂等性。
(可以通过注解+AOP,处理保证setNX成功才能进行后续操作,否则抛出相应日志)