控制庫存的選定的五個技術方案
- mysql樂觀鎖
- mysql悲觀鎖
- redis的原子操作incr
- redis的watch(redis樂觀鎖)
- redis執行lua腳本
測試結果(8核16G,300個線程併發,每次消耗一個庫存,時間單位ms)
![秒殺技術選型分析](http://p2.ttnews.xyz/loading.gif)
方案對比
推薦使用redis+LUA的方式實現。
- mysql樂觀鎖,在高併發的情況下會導致大量的無效請求,同時對mysql數據庫的性能造成影響,導致系統吞吐的急劇下降。
- mysql悲觀鎖,在高併發下雖然執行的總體耗時不會太長,但是會導致用戶長時間等待,並且不釋放數據庫的連接,導致其他業務拿不到數據庫連接。
- redis的watch跟mysql的樂觀鎖有同樣的問題,會導致大量無效的請求,進而導致正常請求無法完成。
- redis的原子操作,incr在壓測看起來是效果最好的。但是因為是先減庫存然後不過庫存不足的時候再回滾當前操作,所以會造成庫存抖動,用戶體驗會不太好。incr和lua的實現原理大致是相同的,會比lua快是因為它只執行單一的incr操作,判斷在client端,並且client端是多線程去執行的,但是redis是單線程執行。
- redis+LUA,這個是最理想的狀態。
閱讀更多 GT七妖妖 的文章