0Pricing
C# Academy · Урок

Политики кэша и его аннулирование

Управляйте сроком жизни кэша и тегами.

«Политики кэша и его аннулирование» — бесплатный урок C# Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Именованные политики

Вместо повторения настроек кэширования для каждой конечной точки один раз определите повторно используемые именованные политики и обращайтесь к ним по имени.

builder.Services.AddOutputCache(options =>
{
    options.AddPolicy("Short", policy =>
        policy.Expire(TimeSpan.FromSeconds(10)));
    options.AddPolicy("Long", policy =>
        policy.Expire(TimeSpan.FromMinutes(10)));
});

Применение именованной политики

При кэшировании конечной точки укажите политику по её имени.

app.MapGet("/catalog", GetCatalog)
   .CacheOutput("Long");

Теги кэша

Теги объединяют связанные записи кэша, чтобы Вы могли удалить их одновременно. Добавьте конечной точке тег с помощью Tag в её политике.

app.MapGet("/products", GetProducts)
   .CacheOutput(policy => policy
        .Expire(TimeSpan.FromMinutes(5))
        .Tag("products"));

Хранилище выходного кэша

Удаление записей выполняется через IOutputCacheStore. Внедрите его и вызовите EvictByTagAsync, чтобы удалить все записи с указанным тегом.

app.MapPost("/products", async (
    Product p, AppDb db, IOutputCacheStore cache, CancellationToken ct) =>
{
    db.Products.Add(p);
    await db.SaveChangesAsync(ct);
    await cache.EvictByTagAsync("products", ct);
    return Results.Created($"/products/{p.Id}", p);
});

Зачем удалять записи при изменении данных

Кэшированный список устаревает сразу после изменения исходных данных. Удаление соответствующего тега при каждом создании, обновлении или удалении позволяет поддерживать актуальность чтения, не дожидаясь истечения срока действия.

// After any mutation:
await cache.EvictByTagAsync("products", ct);

Тегирование по ресурсу

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

app.MapGet("/products/{id}", GetProduct)
   .CacheOutput(policy => policy.Tag("products"));
// Evict the single item's detail + the list together
await cache.EvictByTagAsync("products", ct);

Правила различия в политике

Объедините срок действия, теги и правила различия в одной именованной политике, чтобы задать полный контракт кэширования.

options.AddPolicy("ProductList", policy => policy
    .Expire(TimeSpan.FromMinutes(5))
    .Tag("products")
    .SetVaryByQuery("page", "size"));

Пользовательское значение для различия

VaryByValue позволяет включить в ключ кэша произвольные данные запроса, например идентификатор клиента, полученный из запроса.

policy.VaryByValue(context =>
    new KeyValuePair<string, string>(
        "tenant",
        context.Request.Headers["X-Tenant"].ToString()));

Удаление записей и истечение срока действия

Есть два способа удалить записи из кэша:

  • Истечение срока действия: выполняется автоматически по времени с помощью Expire.
  • Удаление: выполняется явно с помощью EvictByTagAsync при изменении данных.

Используйте оба способа: короткий срок действия — как защитный механизм, а удаление — для обеспечения корректности.

// belt-and-suspenders: Expire(5min) + EvictByTag on write

Блокировки и защита от лавины запросов

По умолчанию кэширование результатов объединяет одновременные промахи кэша: когда множество запросов одновременно обращается к некэшированной конечной точке, только один из них выполняет handler, а остальные ждут. Вы можете отказаться от этого с помощью SetLocking(false).

policy.SetLocking(false); // allow concurrent regeneration

Распределённый кэш результатов

По умолчанию хранилище находится в памяти и является per-instance. Для нескольких серверов используйте распределённое хранилище (например, Redis), чтобы все экземпляры совместно использовали один кэш и удаляли записи из него.

// Register a distributed IOutputCacheStore implementation
// (e.g. a Redis-backed package) so EvictByTag works cluster-wide

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете удаление записей из кэша.

Итоги

Вы изучили политики кэширования и удаление записей:

  • Определяйте повторно используемые именованные политики и применяйте их по имени.
  • Теги объединяют записи; IOutputCacheStore.EvictByTagAsync удаляет их при изменении данных.
  • Сочетайте истечение срока действия (автоматическое) с удалением (явным).
  • Для развёртываний на нескольких серверах используйте распределённое хранилище.

На этом курс по ограничению частоты запросов и кэшированию завершён.

Часто задаваемые вопросы

Урок «Политики кэша и его аннулирование» бесплатный?

Да — полный текст урока «Политики кэша и его аннулирование» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Политики кэша и его аннулирование»?

Управляйте сроком жизни кэша и тегами. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Политики кэша и его аннулирование»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Алгоритмы ограничения частоты запросов
  2. Настройка промежуточного ПО ограничения частоты запросов
  3. Основы кэширования результатов
  4. Политики кэша и его аннулирование
← Назад к C# Academy