redis 分散式鎖解決商品超賣問題
阿新 • • 發佈:2022-01-17
用redis的分散式鎖可以解決商品超賣的問題,簡單事例(基於YII2框架):
/** * @desc 加鎖方法 * * @param $lockName string | 鎖的名字 * @param $timeout int | 鎖的過期時間 * @return 成功返回identifier /失敗返回false */ public function getLock($lockName, $timeout=10) { #獲取唯一識別符號 $identifier=uniqid(); #過期時間 $timeout= intval($timeout); #檢視$lockName是否被上鎖,為$lockName設定過期時間,防止死鎖 if($this->redis->setnx($lockName,$identifier)) { $this->redis->expire($lockName, $timeout); return $identifier; } return false; } /** * @desc 釋放鎖 * * @param $lockName string | 鎖名 * @param $identifier string | 鎖的唯一值 * * @param bool*/ public function releaseLock($lockName,$identifier) { // 判斷是鎖有沒有被其他客戶端修改 if($this->redis->get($lockName)==$identifier) { $this->redis->multi(); $this->redis->del($lockName); #釋放鎖 $this->redis->exec();return true; } else { #其他客戶端修改了鎖,不能刪除別人的鎖 return false; }
$name='Lock:goods_id'; $lockName=$name; $identifier = $this->getLock($lockName); if($identifier===false) { return new \app\coffeecore\BaseApiResponse([ 'code' => 1, 'msg' => '親,該商品正在熱銷中,請稍後再試哦', ]); } /* 業務邏輯處理過程,商品生成訂單減庫存 */ //解鎖 $this->releaseLock($lockName,$identifier);
♥ 作者:離岸少年
♠ 出處:https://www.cnblogs.com/jackzhuo/
♣ 本部落格大多為學習筆記或讀書筆記,本文如對您有幫助,還請多推薦下此文,如有錯誤歡迎指正,相互學習,共同進步。