我的redis 的 watch 和 get 调换位置为啥会出错呢 ?

$redis = new \redis();
$result = $redis->connect('127.0.0.1', 6379);

$redis->watch("mywatchkey");
$mywatchkey = $redis->get("mywatchkey");

$stock_total = 100; //抢购数量
if($mywatchkey < $stock_total) {
    $redis->multi();
    $redis->set("mywatchkey", 1 + $mywatchkey);
    $rob_result = $redis->exec();
    $redis->lPush('user_list', $user_id);
    if ($rob_result) {
        $user_id = 'user_id_' . rand(1, 999999);
      
        
        echo "抢购成功!<br/>";
        echo "剩余数量:".($rob_total-$mywatchkey-1)."<br/>";
        echo "用户列表:<pre>";
        var_dump($mywatchlist);
    } else {
        file_put_contents('./redis_fail_log', "{$user_id}\r\n", FILE_APPEND);
    }
}

我用压力测试, 如果把 $mywatchkey = $redis>get("mywatchkey"); 放到 $redis->watch("mywatchkey"); 之前 , 最后 打印 user_list 的个数就会超出100 ,不知道为啥 。

阅读 828
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进