Что такое Cache Expiration Time (время жизни кэша)?

«Что такое Cache Expiration Time (время жизни кэша)?» — вопрос из категории Архитектура, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Cache Expiration Time (TTL - Time To Live) — это политика, определяющая, как долго данные могут храниться в кэше до того, как они будут считаться устаревшими и удалены или обновлены. Правильная настройка TTL критична для баланса между производительностью (меньше обращений к источнику) и актуальностью данных.

Основные стратегии истечения срока действия:

  1. Абсолютное истечение (Absolute Expiration): Данные удаляются в конкретный момент времени.

    • Пример: Кэшировать список городов на 24 часа.
  2. Скользящее истечение (Sliding Expiration): Таймер сбрасывается при каждом обращении к данным. Если к данным не обращаются в течение заданного интервала, они удаляются.

    • Пример: Кэшировать сессию пользователя, которая должна быть активна, пока пользователь взаимодействует с приложением.

Пример настройки в C# с IMemoryCache:

// Создание опций для записи в кэш
var cacheEntryOptions = new MemoryCacheEntryOptions
{
    // Абсолютное истечение: удалить через 5 минут
    AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5),

    // Скользящее истечение: сбросить таймер при каждом чтении, удалить, если не использовались 2 минуты
    SlidingExpiration = TimeSpan.FromMinutes(2),

    // Приоритет кэша (может влиять на вытеснение при нехватке памяти)
    Priority = CacheItemPriority.High
};

// Добавление данных в кэш
_memoryCache.Set("popularProducts", productList, cacheEntryOptions);

Пример с IDistributedCache (например, Redis):

await distributedCache.SetStringAsync("config", jsonData, new DistributedCacheEntryOptions
{
    AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)
});

Ключевые соображения:

  • Если заданы оба типа истечения (Absolute и Sliding), запись удаляется при наступлении первого из событий.
  • SlidingExpiration идеально подходит для часто используемых, «горячих» данных.
  • AbsoluteExpiration лучше для данных, которые устаревают по расписанию (например, ежедневные отчеты).
  • Истечение срока — это обычно «ленивая» операция; удаление может произойти не мгновенно в момент истечения TTL.