Вступить в клуб →
средняявопросPostgreSQL, ORM и кэш Redis

После обновления товара клиенты час видят старую цену

Карточка товара кэшируется по схеме cache-aside:

async function getProduct(id: string) {
  const cached = await redis.get(`product:${id}`);
  if (cached) return JSON.parse(cached);

  const product = await repo.findById(id);
  await redis.set(`product:${id}`, JSON.stringify(product), 'EX', 3600);
  return product;
}

async function updatePrice(id: string, price: number) {
  await repo.updatePrice(id, price);
}

Контент-менеджеры жалуются: после смены цены магазин ещё около часа показывает старую. Что нужно исправить?

  • Уменьшить TTL до минуты: тогда данные будут обновляться достаточно быстро, а нагрузка на базу останется приемлемой
  • Отказаться от кэша для карточек товара: цена — критичные данные, их кэшировать нельзя
  • При обновлении в базе инвалидировать ключ — удалять `product:{id}` в той же операции записи, чтобы следующее чтение подняло свежие данные
  • Писать новое значение только в Redis, а в базу переносить фоновой задачей — тогда кэш всегда актуален, а запись в базу разгрузится

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела