Выбор ответа Senior Кеширование обновлено
Инвалидация кеша до коммита
Вопрос
Код удаляет ключ кеша товара, затем обновляет товар в транзакции и коммитит. Иногда в кеше остаётся старая цена. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Между удалением и коммитом параллельный запрос кладёт старую цену в кеш. Пока транзакция не закоммичена, другие соединения видят старые данные.
Варианты ответа
- Redis не успевает удалить ключ до коммита, и команда DEL выполняется позже
- Между удалением и коммитом параллельный запрос кладёт старую цену в кешправильный ответ
- Удаление ключа откатывается вместе с транзакцией, если она была долгой
- Django кеширует ORM-объекты в памяти процесса и отдаёт их вместо базы
Разбор
Пока транзакция не закоммичена, другие соединения видят старые данные. Запрос, пришедший в это окно, получает промах, читает старую цену и записывает её обратно. Удалять или обновлять кеш нужно после коммита (transaction.on_commit), а для надёжности держать разумный TTL или версионировать ключи. Redis удаляет мгновенно и в транзакции базы не участвует.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.