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