2016-01-19 8 views
0

Я прочитал сообщение о распределенных замках с 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 

Я думаю, что есть состояние гонки с этой моделью:

  1. Клиент A получает блокировку с истечением 3 секунды. SET key randomstring1 NX PX 3000
  2. Сон 2.99 секунд.
  3. Клиент A освобождает блокировку и вызывает вышеуказанный код.
  4. Условие истинно. if redis.call("get",KEYS[1]) == ARGV[1] then
  5. Срок действия ключа истечения срока действия
  6. Клиент B приобретает анторный замок. SET key randomstring2 NX PX 3000
  7. Клиент A удалить ключ.
  8. Блокировка клиента B удалена Клиентом A!

ответ

2

Нет, здесь нет гонки состояние. Сценарии LUA выполняются атомарно. Это означает, что никакие команды из других подключений (клиентов) не будут обработаны до того, как они будут работать над завершением работы LUA (даже Redis internal cron, который фактически обрабатывает истекшие элементы).

 Смежные вопросы

  • Нет связанных вопросов^_^