Sobes.tech
Senior
20

Расскажите про систему резервирования товаров: как исключали двойные продажи с помощью Redis?

Companies where asked
А7

Answer from AI

sobes.tech AI

Для исключения двойных продаж товаров с помощью Redis часто используют механизм атомарных операций и блокировок.

Основная идея:

  • При попытке зарезервировать товар клиентом, приложение пытается установить ключ в Redis, например, reserve:product_id:user_id с помощью команды SETNX (set if not exists).
  • Если ключ успешно установлен, значит товар зарезервирован для этого пользователя.
  • Если ключ уже существует, значит товар уже зарезервирован, и повторная продажа исключается.
  • Для автоматического снятия резерва можно установить TTL (время жизни ключа), чтобы резерв автоматически снимался, если пользователь не завершил покупку.

Пример на Go с использованием Redis:

import (
    "github.com/go-redis/redis/v8"
    "context"
    "time"
)

func ReserveProduct(ctx context.Context, rdb *redis.Client, productID, userID string) (bool, error) {
    key := fmt.Sprintf("reserve:%s:%s", productID, userID)
    // Попытка установить ключ с TTL 15 минут
    success, err := rdb.SetNX(ctx, key, "reserved", 15*time.Minute).Result()
    if err != nil {
        return false, err
    }
    return success, nil // true если резерв успешно установлен
}

Таким образом, Redis выступает как быстрый и надежный механизм для контроля состояния резервирования, предотвращая гонки и двойные продажи.