Ответ
Стратегия инвалидации кеша зависит от требований к актуальности данных и характера нагрузки. Вот основные подходы и когда их применять:
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.