在高并發時候Llen多人會獲取到相同的值比如秒殺時候庫存10個通過llen
有大佬遇到過這個問題嗎:Redis原子性問題
慕勒3428872
2019-09-19 11:59:51
TA貢獻1829條經驗 獲得超7個贊
你是通過lpush添加數據,然后llen<10來判斷是否超賣?原子性是對redis命令來說的,并沒有說redis多個命令還是原子性啊,redis原子性這個話術本來就有問題。lpop沒問題是lpop是獲取加移出,你事先把固定數量的貨品lpush入隊列,根據redis命令串行執行這個特點,lpop當然不會超賣,因為可以pop的數據項是一定的。但是如果你用llen來判斷,命令之間是串行執行但不是原子的,例如,llen和lpop由兩個實例同時發出,server端先執行llen再執行lpop,那么根據llen的返回做出的決策是有問題的,會導致超賣所以你沒有理解一個本質:命令原子性、redisserver執行串行化、多實例client可以并發請求redis
TA貢獻1785條經驗 獲得超4個贊
列一個場景:A調用Llen返回1B調用Llen返回1B先扣除并提交A也扣除并提交這種場景就不能避免超賣,因為在取出長度的時候是原子,但是取出后的操作會繼續扣除的。
舉報