Выбор ответа Senior Кеширование обновлено

Безопасное снятие блокировки в Redis

Вопрос

Блокировку на пересчёт берут SET lock:key <token> NX EX 30. Как её правильно снять?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Удалить ключ, только если там наш токен, атомарно через Lua. Если пересчёт шёл дольше 30 секунд, блокировка истекла, и её уже взял другой процесс.

Варианты ответа

  1. Просто DEL lock:key сразу после пересчёта
  2. Удалить ключ, только если там наш токен, атомарно через Luaправильный ответ
  3. Дождаться истечения TTL, ничего не удаляя вручную
  4. EXPIRE lock:key 0 без проверок, это быстрее DEL

Разбор

Если пересчёт шёл дольше 30 секунд, блокировка истекла, и её уже взял другой процесс. Безусловный DEL удалит чужую блокировку, и пересчёт пойдёт параллельно. Проверка и удаление должны быть атомарными, иначе между GET и DEL ключ может смениться: поэтому Lua-скрипт. Ждать истечения TTL безопасно, но задерживает следующих.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.