Проверяет знание распределённых систем и распределённых блокировок.
Redis lock позволяет координировать несколько инстансов сервиса, но не гарантирует абсолютную корректность при сетевых сбоях и проблемах времени жизни блокировки.
Если ключ создался:
лок получен.
Если существует:
лок уже занят.
Проблемы начинаются в распределённой системе.
Пример:
Сервис получил лок.
Выполняет долгую операцию.
GC pause 40 секунд.
TTL истёк.
Другой сервис получил тот же лок.
Теперь два процесса одновременно считают, что владеют блокировкой.
Другие проблемы:
network partition;
failover Redis;
рассинхронизация часов.
Поэтому Redis lock подходит для:
фоновых задач;
cron-job;
дедупликации.
Но плохо подходит для:
финансовых операций;
критичных транзакций.
Для строгой консистентности часто используют:
PostgreSQL advisory lock;
ZooKeeper;
etcd.
Вывод:
Redis lock удобен, но не является абсолютной гарантией эксклюзивности.