后半部分?jǐn)?shù)對的,但是前半部分你說的錯(cuò)了,不是redis線程競爭的問題,因?yàn)镽edis的命令執(zhí)行時(shí)單進(jìn)程單線程模型。你可以思考下,incrby做計(jì)數(shù),你想做到超賣了就直接終止+1,是不是每次之前都得先讀一次計(jì)數(shù),然后決定是否有調(diào)用incrby,此時(shí)就是 get + incrby 兩次操作,也就是會(huì)分成了兩次網(wǎng)絡(luò)調(diào)用操作,此時(shí)這兩個(gè)操作在(php)多進(jìn)程模型下是無法保證原子性操作的。
2019-10-02
同學(xué)你好,你的思路不錯(cuò),可以繼續(xù)去想下直接incrby改會(huì)有什么問題,老師提供的思路只是其中一個(gè)方案,真正場景實(shí)現(xiàn)肯定會(huì)有非常多的方案,需要大家自己思考。
redis->eval本身就是執(zhí)行l(wèi)ua腳本,redis->incrby理論上也可以防止邊界條件的發(fā)生,不會(huì)造成超賣,因?yàn)閕ncrby就實(shí)現(xiàn)了查詢+修改的原子操作,但是有一點(diǎn)點(diǎn)小缺點(diǎn)就是,不能做到只要一超賣了就直接終止+1。