项目中如何防止并发接口

1、查询用户余额应放在事务中,行锁
Innodb行锁对主键或唯一索引生效。tp连贯操作lock(true)等于在查询后面加for update。其他索引会放弃行锁改用表锁。

2、token有效期

3、禁止多机登录

4、限制接口调用频率

 $iuc_id = $this->request->request("iuc_id");
 $mill_num = $this->request->request("mill_num");
 $obtain_gold = $this->request->request("obtain_gold");
 $md5str = md5($this->user_id . $iuc_id . $mill_num . $obtain_gold);
 $cachekey = "lock:iuc_record:{$md5str}";
 if (!check_api_limit($cachekey)) {
     return json_error('操作太快');
 }
function check_api_limit($key, $api_limit = 1, $api_limit_time = 500)
{
    $redis = new \Redis();
    $redis->connect(config('redis.server'), config('redis.port'));
    $redis->auth(config('redis.pwd'));
    $check = $redis->exists($key);
    if ($check) {
        $redis->incr($key);
        $count = $redis->get($key);
        if ($count > $api_limit) {
            return false;
        }
    } else {
        $redis->incr($key);
        $redis->pExpire($key, $api_limit_time);
    }
    return true;
}

5、防止多个订单同时被支付

6、更新时的多条件限制

你可能感兴趣的:(php)