Выбор ответа Senior Кеширование обновлено
Безопасное снятие блокировки в Redis
Вопрос
Блокировку на пересчёт берут SET lock:key <token> NX EX 30. Как её правильно снять?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Удалить ключ, только если там наш токен, атомарно через Lua. Если пересчёт шёл дольше 30 секунд, блокировка истекла, и её уже взял другой процесс.
Варианты ответа
- Просто
DEL lock:keyсразу после пересчёта - Удалить ключ, только если там наш токен, атомарно через Luaправильный ответ
- Дождаться истечения TTL, ничего не удаляя вручную
EXPIRE lock:key 0без проверок, это быстрее DEL
Разбор
Если пересчёт шёл дольше 30 секунд, блокировка истекла, и её уже взял другой процесс. Безусловный DEL удалит чужую блокировку, и пересчёт пойдёт параллельно. Проверка и удаление должны быть атомарными, иначе между GET и DEL ключ может смениться: поэтому Lua-скрипт. Ждать истечения TTL безопасно, но задерживает следующих.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.