php使用redis watch秒杀抢购
redis的watch multi exec 方法实现秒杀抢购。优点:使用了乐观锁没有锁的等待,比队列方式减少了大量的内存消耗。 watch 监视一个或多个key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断. $redis = new redis(); $result = $redis->connect('127.0.0.1',6379); $getnum = $redis->get('getnum');//已抢数量 $num = 100;//抢购总数量 if($getnum < $num){ $redis->watch('getnum');//监听key $redis->multi();//开启事务 //插入抢购数据 $redis->hSet("userList",'user_id_'.mt_rand(1,999),time()); $redis->set("getnum",$getnum+1);//抢购到+1 $robResult = $redis->exec();//执行事务 if ($robResult) { echo "抢购成功!<br/>"; echo "剩余数量:" . ($num - ($redis->get("getnum"))) . "<br/>"; echo "用户列表:<pre>"; var_dump($redis->hGetAll("userList")); } else { echo "手气不好,再抢购!"; exit; } }else{ echo "已售罄"; exit; }
世界上最美的风景,是自己努力的模样