Распределённая блокировка в 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()
Если процесс упадёт до вызова Del, без TTL блокировка останется навсегда (deadlock). TTL ограничивает время жизни ключа - через 30 секунд он исчезнет и другой клиент сможет взять блокировку.
Удалять ключ нужно только если значение совпадает с нашим токеном (Lua-скрипт GET + DEL атомарно), иначе можно снять чужую блокировку. Для кластеров используют алгоритм Redlock (несколько независимых инстансов Redis).