---- 我的設計,未經實踐,歡迎指正。mysql
場景
預估請求量:1kw,商品:gbjd,庫存:50。redis
server數量:10。
server實現(queryCount + stock in redis)
1:限流
limit
初始爲5-10,limit大時,儘可能在有人取消時,第一次進來其餘用戶能秒殺到。sql
一次處理後,當庫存減爲0時,可將limit減爲1,若是有人取消訂單,再來的請求可進來處理。設計
queryCount
AtomicInteger/Semaphore,記錄當前正在處理的請求量,當queryCount等於limit時,再來的請求直接拒絕。server
2:庫存
redis中記錄stock = 50,當請求經過限流後,若是stock <= 0,則秒殺失敗。
若是stock > 0,則執行decr stock,當返回值 >= 0 時,去myslq減庫存。
update product set stock = stock - 1 where sku = 'gbjd';
(因已經過redis decr,mysql不用再判斷old stock)。
當返回值 < 0 時,執行incr stock還原庫存,並返回秒殺失敗。it
3:取消訂單
取消訂單,mysql stock + 1,redis中incr stock。
經過限流的用戶,經過redis decr stock後,下單去mysql減庫存。date
4:失敗map
減庫存時,若是mysql減庫存失敗,重試後,仍失敗,redis incr stock,秒殺失敗。請求