tp5 解决重复下单(并发)的问题
在实际的开发中,因为缺乏对下单并发场景的认识,后端逻辑没有对重复请求进行过滤,就会出现重复订单(严重的业务漏洞)、产生经济损失和退单的售后成本。所以我们十分有必要进行对重复订单进行处理。
常见的方法有以下几种:
【锁-机制】
在数据库中建立锁表
CREATE TABLE `TradeLock` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`type` int(11) NOT NULL COMMENT '锁类型',
`lockId` int(11) NOT NULL DEFAULT '0' COMMENT '业务ID',
`status` int(11) NOT NULL DEFAULT '0' COMMENT '锁状态',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='Trade锁机制';
每次request进来则往表里面插入数据:
成功--获得锁--继续操作
失败-->返回错误
在应对高并发场景,频繁请求数据不是明智的方法,这里我们就想到用redis做队列控制。
原理:入队---扣库存--执行(在原队列有逻辑没处理完成即返回库存不足!)
【计数器】
每次请求+1 利用cache缓存、设定失效时间30s(具有根据业务场景)。假如里面有请求则返回不要重复下单。以下是利用tp5里面的redis的cache驱动做计数器。
use thinkCache;
#缓存计数器 解决并发重复订单问题
$request =Cache('request_'.$user_id);
$request =$request+1;
Cache('request_'.$user_id,$request,30);
if($request>1){
$response['code'] =0;
$response['msg'] ='请勿重复操作';
$response['data']='';
return json($response);
}