Состояние гонки в распределенных замках с Redis
Я прочитал пост о распределенных блокировках с Redis по адресу http://redis.io/topics/distlock. Есть сценарий lua, чтобы описать, как сделать "разблокировать".
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
Я думаю, что есть гонка с этой моделью:
- Клиент А получает блокировку с истечением 3 секунд.
SET key randomstring1 NX PX 3000
- Спать 2,99 секунды.
- Клиент А снимает блокировку и вызывает вышеуказанный код.
- Условие верно.
if redis.call("get",KEYS[1]) == ARGV[1] then
- Срок действия ключа истекает
- Клиент Б получает антор блокировку.
SET key randomstring2 NX PX 3000
- Клиент А удаляет ключ.
- Блокировка клиента B удалена клиентом A!
1 ответ
Решение
Нет, здесь нет условий гонки. Скрипты LUA выполняются атомарным способом. Это означает, что никакие команды от других соединений (клиентов) не будут обработаны до завершения работы сценария LUA (даже внутренний cron Redis, который фактически обрабатывает элементы с истекшим сроком действия).