Цену поменяли, а витрина час показывает старую
Карточка товара кэшируется по схеме cache-aside:
$product = Cache::remember("product:{$id}", 3600, fn () => Product::find($id));
Менеджер изменил цену через админку, в базе новое значение, но на витрине ещё почти час висит старая цена.
Почему так и что нужно сделать?
- Кэш хранит значение до истечения TTL и об изменении в БД ничего не знает: при сохранении товара нужно сбрасывать или перезаписывать ключ product:{id}
- Redis отдаёт устаревшее значение из-за отставания реплики, с которой идёт чтение; поможет принудительное чтение с мастера
- Нужно снизить TTL до одной секунды: это и есть корректное решение задачи инвалидации, а нагрузка на БД вырастет незначительно
- Кэш живёт только в рамках одного запроса, а старую цену между запросами отдаёт OPcache, который надо сбрасывать при деплое
