В какой момент нужно инвалидировать или вытеснять кеш в Redis?

«В какой момент нужно инвалидировать или вытеснять кеш в Redis?» — вопрос из категории Брокеры сообщений, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Стратегия инвалидации кеша зависит от требований к актуальности данных и характера нагрузки. Вот основные подходы и когда их применять:

1. Инвалидация по времени (TTL - Time to Live)

Используйте, когда данные могут быть "слегка устаревшими" и их обновление предсказуемо.

// Установка ключа с автоматическим истечением через 5 минут
IDatabase cache = connection.GetDatabase();
cache.StringSet("user:profile:123", jsonData, TimeSpan.FromMinutes(5));

Когда применять: Для данных, которые меняются нечасто (профили пользователей, каталоги товаров, статичный контент).

2. Явная (активная) инвалидация

Удаляйте ключ сразу при изменении исходных данных. Это гарантирует консистентность.

// После успешного обновления записи в БД
await _userRepository.UpdateAsync(user);
await cache.KeyDeleteAsync("user:profile:" + user.Id); // Немедленная инвалидация

Когда применять: Для критически важных данных, где устаревшая информация недопустима (баланс счета, статус заказа, актуальная цена).

3. Паттерн "Write-Through" или "Cache-Aside" с инвалидацией

Кеш обновляется синхронно с записью в основное хранилище.

public async Task UpdateProductAsync(Product product)
{
    // 1. Обновить базу данных
    await _dbContext.SaveChangesAsync();
    // 2. Обновить кеш (или удалить, чтобы следующее чтение загрузило свежие данные)
    var cacheKey = $"product:{product.Id}";
    await _cache.StringSetAsync(cacheKey, JsonSerializer.Serialize(product), TimeSpan.FromHours(1));
}

4. Вытеснение политиками Redis (LRU, LFU)

Redis автоматически удаляет ключи при нехватки памяти, согласно настройке maxmemory-policy (например, allkeys-lru). Когда полагаться: Это стратегия "последней линии обороны", а не основная. Всегда лучше управлять сроком жизни ключей явно.

Рекомендации:

  • Комбинируйте подходы: Используйте TTL как "страховку" даже при явной инвалидации.
  • Мониторьте hit rate: Низкий процент попаданий в кеш может указывать на слишком короткий TTL или неэффективные ключи.
  • Используйте паттерны: Для сложных сценариев рассмотрите паттерны Cache-Aside, Read-Through или Write-Behind.