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