php redis實現在高並發下防止庫存超賣解決方案
我直接用set get來實現 畢竟他速度最快。。
$prize_id=2; //讀取庫存 如果緩存沒數據那就先讀取數據庫 里面也實現了分布式鎖 $sql='select prizecount from dsfs_prizelimit where id=?'; $key='prizeid'.$prize_id; $prizecount=$this->getcacheinfo($sql,array($prize_id),$key,-1)[0]['prizecount']; //如果沒有庫存了 if($prizecount<=0){ exit(); } //實現購買邏輯 //庫存減去1 這個地方要注意 mysql事務成功后再去執行redis $redis->set($key,$prizecount-1);
ps: 進入購買邏輯 如果購買失敗 redis庫存還是要減去的
上面代碼看的出來如果在高並發下明顯力不從心
所以要讓代碼進化下 用redis 分段加鎖 另外1redis 生成2個redis
直接把庫存讀取出來 比如100
分成2個就是除以2
$redis->set('ss1',50);
$redis->set('ss2',50);
然后隨機讀取就行
不過上面代碼只能加快了判斷速度判斷庫存速度 下面購買邏輯速度還是一樣