После обновления товара клиенты час видят старую цену
Карточка товара кэшируется по схеме 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, а в базу переносить фоновой задачей — тогда кэш всегда актуален, а запись в базу разгрузится
