亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

redis原子性控制超賣問題

老師,既然redis是單線程,那為什么非要配合lua呢,直接在代碼里執行redis->eval或者redis->incrby不就能控制超賣么,

正在回答

1 回答

同學你好,你的思路不錯,可以繼續去想下直接incrby改會有什么問題,老師提供的思路只是其中一個方案,真正場景實現肯定會有非常多的方案,需要大家自己思考。
redis->eval本身就是執行lua腳本,redis->incrby理論上也可以防止邊界條件的發生,不會造成超賣,因為incrby就實現了查詢+修改的原子操作,但是有一點點小缺點就是,不能做到只要一超賣了就直接終止+1。

0 回復 有任何疑惑可以回復我~
#1

MKfans菜鳥

老師我也有個問題不明白,有一點點小缺點就是,不能做到只要一超賣了就直接終止+1,這句話是因為這個redis->eval這個東西在redis里面執行的,所以不存在這個情況,如果放到php中去執行,因為redis線程競爭,有可能在最后一件的時候出現,2個前后查完,第一個正在寫的,第二個也準備寫緣故嗎?
2019-10-06 回復 有任何疑惑可以回復我~
#2

皮奇 回復 MKfans菜鳥

后半部分數對的,但是前半部分你說的錯了,不是redis線程競爭的問題,因為Redis的命令執行時單進程單線程模型。你可以思考下,incrby做計數,你想做到超賣了就直接終止+1,是不是每次之前都得先讀一次計數,然后決定是否有調用incrby,此時就是 get + incrby 兩次操作,也就是會分成了兩次網絡調用操作,此時這兩個操作在(php)多進程模型下是無法保證原子性操作的。
2019-10-15 回復 有任何疑惑可以回復我~
#3

慕勒4092611 回復 皮奇

老師,你的意思是 我直接用if ($redis->incrby($key, 1) > 1000)判斷 是可以做到防超賣,但是這個$key會一直incrby到很大?
2020-05-19 回復 有任何疑惑可以回復我~
#4

慕粉3988021 回復 慕勒4092611

我也想知道,請老師回答
2020-09-17 回復 有任何疑惑可以回復我~
查看1條回復

舉報

0/150
提交
取消

redis原子性控制超賣問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號