1. 程式人生 > 其它 >redis 分散式鎖解決商品超賣問題

redis 分散式鎖解決商品超賣問題

用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/
♣ 本部落格大多為學習筆記或讀書筆記,本文如對您有幫助,還請多推薦下此文,如有錯誤歡迎指正,相互學習,共同進步。