🔴 Сложный · 3 очк. Redis
Как реализовать распределённую блокировку в Redis?
A LOCK key
B SET key value NX EX timeout
C MUTEX key
D SETNX без таймаута
Объяснение вопроса

Распределённая блокировка в Redis строится на атомарной команде SET key value NX EX seconds: установить ключ только если его ещё нет (NX) и с временем жизни (EX).

Базовый вариант

// Получить блокировку
ok, err := client.SetNX(ctx, "lock:resource1", "unique-token", 30*time.Second).Result()
if !ok {
    return errors.New("lock held by another client")
}
defer client.Del(ctx, "lock:resource1")  // освободить

// Критическая секция
doWork()

Зачем TTL (EX)

Если процесс упадёт до вызова Del, без TTL блокировка останется навсегда (deadlock). TTL ограничивает время жизни ключа - через 30 секунд он исчезнет и другой клиент сможет взять блокировку.

Безопасное освобождение

Удалять ключ нужно только если значение совпадает с нашим токеном (Lua-скрипт GET + DEL атомарно), иначе можно снять чужую блокировку. Для кластеров используют алгоритм Redlock (несколько независимых инстансов Redis).

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.