Python知識(shí)分享網(wǎng) - 專業(yè)的Python學(xué)習(xí)網(wǎng)站 學(xué)Python,上Python222
Redis分布式鎖存在的問題及解決方案(值得珍藏) PDF 下載
匿名網(wǎng)友發(fā)布于:2024-02-14 10:52:59
(侵權(quán)舉報(bào))
(假如點(diǎn)擊沒反應(yīng),多刷新兩次就OK!)

Redis分布式鎖存在的問題及解決方案(值得珍藏) PDF 下載  圖1

 

 

 

資料內(nèi)容:

 

Redis分布式鎖存在的問題


在購(gòu)票軟件的情境中,當(dāng)僅剩一張或幾張票時(shí),眾多用戶同時(shí)嘗試購(gòu)買。在不考慮任何外部干擾的情況下,
邏輯上,系統(tǒng)應(yīng)首先檢查是否還有余票。如果仍有余票,用戶可以順利購(gòu)買并導(dǎo)致庫(kù)存相應(yīng)減少;如果沒有
余票,系統(tǒng)會(huì)提示用戶票數(shù)不足,購(gòu)買失敗。偽代碼如下:

 

void buyTicket() {
int stockNum = byTicketMapper.selectStockNum();
if(stockNum>0){
//TODO 買票流程....
byTicketMapper.reduceStock(); // 扣減庫(kù)存
}else{
log.info("=====>票賣完了<====");
}
}

 

這段代碼在邏輯上沒有問題,但是在并發(fā)場(chǎng)景下,可能會(huì)存在一個(gè)嚴(yán)重的問題。當(dāng)剩余票數(shù)為1時(shí),有A,B兩
個(gè)用戶同時(shí)點(diǎn)擊了購(gòu)買按鈕,A用戶通過了庫(kù)存大于0的校驗(yàn)并開始執(zhí)行購(gòu)票邏輯,但是由于一些原因造成A
用戶的購(gòu)票線程有短暫的阻塞。而在這個(gè)阻塞的過程中,用戶B發(fā)起了購(gòu)買請(qǐng)求,并且也通過了庫(kù)存大于0的
校驗(yàn),直到整個(gè)購(gòu)買流程執(zhí)行完成并且扣減了庫(kù)存。那么這個(gè)時(shí)候剩余庫(kù)存剛好為0,不會(huì)再有用戶發(fā)起購(gòu)
買請(qǐng)求,這時(shí)用戶A的購(gòu)買請(qǐng)求阻塞被喚醒,因?yàn)樵诖酥耙呀?jīng)校驗(yàn)過庫(kù)存大于0,所以執(zhí)行完購(gòu)買流程后,
庫(kù)存還會(huì)被扣減一次。那么此時(shí)的庫(kù)存為-1,這就是常聽到的超賣問題。