核心数据电商

秒杀与库存

当一万名购物者在同一秒点击购买时,准确卖出您现有的库存,并把机器人挡在门外。

库存扣减
原子
件超卖
0
自动释放的预留
10 min
步骤 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 协议,您可以把现有客户端指向它,运行这些相同的命令。