Обновили тариф в базе, а API шесть часов отдаёт старую цену
Кэширование тарифов реализовано так:
public Task<Tariff> GetAsync(int id) =>
_cache.GetOrCreateAsync($"tariff:{id}", entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(6);
return _repo.GetAsync(id);
});
public Task UpdateAsync(Tariff tariff) => _repo.UpdateAsync(tariff);
Менеджер меняет цену, база обновляется, но API до шести часов продолжает отдавать старое значение. Что нужно исправить?
- Снизить время жизни записи до одной минуты — это единственный корректный способ добиться актуальности
- В UpdateAsync после успешной записи в базу удалять ключ tariff:{id}; TTL остаётся страховкой, а не механизмом актуализации
- Проблема не в кэше: GetOrCreateAsync перечитывает базу при каждом обращении, значит изменения не сохраняет сам репозиторий, там и надо искать причину
- Перенести кэш в Redis: в распределённом кэше запись в базу инвалидирует связанные ключи автоматически
