Senior
21
Расскажите про систему резервирования товаров: как исключали двойные продажи с помощью Redis?
Компании, где спрашивали
А7
Ответ от нейросети
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 выступает как быстрый и надежный механизм для контроля состояния резервирования, предотвращая гонки и двойные продажи.