在高并發(fā)時候Llen多人會獲取到相同的值比如秒殺時候庫存10個通過llen
Redis原子性問題求解答!
森林海
2019-09-12 20:39:05
TA貢獻1893條經(jīng)驗 獲得超10個贊
你是通過lpush添加數(shù)據(jù),然后llen<10來判斷是否超賣?原子性是對redis命令來說的,并沒有說redis多個命令還是原子性啊,redis原子性這個話術(shù)本來就有問題。lpop沒問題是lpop是獲取加移出,你事先把固定數(shù)量的貨品lpush入隊列,根據(jù)redis命令串行執(zhí)行這個特點,lpop當(dāng)然不會超賣,因為可以pop的數(shù)據(jù)項是一定的。但是如果你用llen來判斷,命令之間是串行執(zhí)行但不是原子的,例如,llen和lpop由兩個實例同時發(fā)出,server端先執(zhí)行l(wèi)len再執(zhí)行l(wèi)pop,那么根據(jù)llen的返回做出的決策是有問題的,會導(dǎo)致超賣所以你沒有理解一個本質(zhì):命令原子性、redisserver執(zhí)行串行化、多實例client可以并發(fā)請求redis
TA貢獻1827條經(jīng)驗 獲得超8個贊
列一個場景:A調(diào)用Llen返回1B調(diào)用Llen返回1B先扣除并提交A也扣除并提交這種場景就不能避免超賣,因為在取出長度的時候是原子,但是取出后的操作會繼續(xù)扣除的。
舉報