Вступить в клуб →
средняявопросКэш, очереди и микросервисы

Обновили тариф в базе, а 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: в распределённом кэше запись в базу инвалидирует связанные ключи автоматически

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

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

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

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