php使用redis watch秒殺搶購
阿新 • • 發佈:2020-12-09
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; }