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; }