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

Инвалидация кеша до коммита

Вопрос

Код удаляет ключ кеша товара, затем обновляет товар в транзакции и коммитит. Иногда в кеше остаётся старая цена. Почему?

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

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

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

Коротко

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

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

  1. Redis не успевает удалить ключ до коммита, и команда DEL выполняется позже
  2. Между удалением и коммитом параллельный запрос кладёт старую цену в кешправильный ответ
  3. Удаление ключа откатывается вместе с транзакцией, если она была долгой
  4. Django кеширует ORM-объекты в памяти процесса и отдаёт их вместо базы

Разбор

Пока транзакция не закоммичена, другие соединения видят старые данные. Запрос, пришедший в это окно, получает промах, читает старую цену и записывает её обратно. Удалять или обновлять кеш нужно после коммита (transaction.on_commit), а для надёжности держать разумный TTL или версионировать ключи. Redis удаляет мгновенно и в транзакции базы не участвует.

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

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