核心資料電子商務

限時搶購與庫存

當一萬名購物者在同一秒按下購買時,賣出的數量正好就是您的庫存,並擋下機器人。

庫存扣減
原子
個超賣的單位
0
會自行釋放的保留
10 分鐘
步驟 1 / 6
載入庫存

500 個單位開賣。

範例工作階段playing
# 載入庫存
hotkv> SET stock:sneaker-x 500
OK

以真實 HotKV 指令與範例回覆呈現的動畫導覽。點擊任一步驟即可跳到該步驟。 指令與回覆維持英文,與您在 HotKV 中輸入及看到的完全一致。

問題

在限時搶購中,庫存資料庫正好在最關鍵的時刻成為瓶頸。先讀後寫的檢查在並行下會超賣,被放棄的購物車會永遠鎖住庫存,而機器人在真正的顧客還在載入頁面時,就把庫存買光了。

HotKV 如何處理

庫存存放在以原子方式遞減的計數器中,因此並行的買家永遠無法買走超過現有的數量。每筆保留是一個有十分鐘到期時間的鍵,依顧客設定的速率限制會減緩機器人,而確認後的訂單則進入串流,由出貨以自己的步調處理。

逐步說明

逐個指令看看發生了什麼事

  1. 01

    載入庫存

    500 個單位開賣。

    SET stock:sneaker-x 500
  2. 02

    控制機器人

    每位顧客每 10 秒最多可嘗試兩次。機器人立刻就超過了。

    GCRA.LIMIT buy:customer:881 10000 2
  3. 03

    拿走一個單位

    DECR 是原子的。10,000 次並行點擊永遠無法拿走超過 500 個單位。

    DECR stock:sneaker-x
  4. 04

    保留十分鐘

    如果結帳被放棄,保留會自行到期,並由清掃程式把該單位放回去。

    SET hold:sneaker-x:order-7781 customer:42 NX EX 600
  5. 05

    處理售罄

    當 DECR 降到零以下時,該單位會被歸還,購物者會看到售罄。庫存不會長時間處於負數。

    INCR stock:sneaker-x
  6. 06

    把訂單交給出貨

    已付款的訂單會附加到串流。倉儲系統以自己的步調逐一處理。

    XADD orders * order 7781 sku sneaker-x customer 42
適用之處

真實世界的情境

球鞋與商品限量開賣

限量版在幾秒內售罄,而且一雙都不會超賣。

售票

座位在結帳期間保留幾分鐘,如果買家離開,就會自動釋放。

餐飲與生鮮外送

配送時段是計數器,在顧客預約時以原子方式遞減。

內建

您能獲得什麼

原子計數器

DECR 與 INCR 一步就能改變庫存,沒有競爭條件。

DECRINCRBY

會過期的保留

保留是帶有 TTL 的鍵。

SETNXEX

機器人防護

依顧客設定的限制,並提供精確的重試時間。

GCRA.LIMIT

訂單交接

供出貨使用的串流,具備消費者群組與確認機制。

XADDXREADGROUP

常見問題

過期的保留如何歸還庫存?

過期的保留可以透過鍵空間通知或定期清掃察覺,然後再次增加庫存計數器。

我可以只檢查庫存而不拿走嗎?

可以。GET 會回傳目前的數量。只有 DECR 才會保留。

多品項的購物車呢?

使用 MULTI 與 EXEC,或使用函式,一起遞減多個計數器。

相關使用情境

在您自己的工作負載上試試看

HotKV 支援 Redis 協定,因此您可以將現有的用戶端指向它,並執行這些相同的指令。