多線程扣庫存的情況下如何保證線程安全?
可以使用基于redis實現(xiàn)的分布式鎖
如何實現(xiàn)随闽?
首先來介紹redis中的幾個命令
SETNX key value
當(dāng)且僅當(dāng)key不存在時质况,set一個key為value的字符串斧账,返回1;若key存在冠桃,則什么都不做命贴,返回0
expire key timeout
為key設(shè)置一個超時時間,超過這個時間鎖會自動釋放食听,避免死鎖胸蛛。
delete key
刪除key,釋放鎖
實現(xiàn)流程:
- 獲取鎖的時候樱报,使用setnx命令生成一個key充當(dāng)鎖的角色葬项,key的value值是一個隨機值
- 給key設(shè)置一個超時時間,超過這個時間沒有獲取鎖就放棄防止死鎖的產(chǎn)生
- 釋放鎖的時候根據(jù)value的值判斷是不是該鎖迹蛤,若是該鎖則釋放
通過這種手段可以在多線程扣庫存的時候讓線程按照順序依次扣庫存民珍,線程只有獲取了鎖才能執(zhí)行扣庫存操作
補充
在項目中下訂單減庫存的時候如何解決重復(fù)消費問題?
在訂單表中也包含了下訂單人的信息即用戶的userId盗飒,因為userId被創(chuàng)建了唯一索引只有一個嚷量,訂單表中如果有相同的userId則刪除該訂單