Основные данныеЭлектронная коммерция

Распродажи и складские остатки

Продавайте ровно столько, сколько есть на складе, когда десять тысяч покупателей нажимают «Купить» в одну секунду, и не пускайте ботов.

списание остатка
Атомарное
проданных сверх остатка единиц
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
Справочник:DECRSETGCRA.LIMITXADD

Частые вопросы

Как истёкшие удержания возвращают остаток?

Истёкшие удержания можно заметить через уведомления о пространстве ключей или периодической очисткой, которая снова увеличивает счётчик остатка.

Можно ли проверить остаток, не забирая его?

Да. GET возвращает текущее количество. Резервирует только DECR.

А как быть с корзинами из нескольких товаров?

Используйте MULTI и EXEC или функцию, чтобы уменьшить сразу несколько счётчиков.

Связанные сценарии

Попробуйте на своей нагрузке

HotKV понимает протокол Redis, поэтому вы можете подключить к нему существующий клиент и выполнить те же команды.