0Pricing
C# Academy · Урок

Абстракция IDistributedCache

Кэшируйте данные на нескольких серверах.

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

Зачем нужно распределённое кэширование

Кэш в памяти находится внутри одного процесса, поэтому теряется после перезапуска и не используется совместно серверами. Распределённый кэш находится во внешнем хранилище (например, Redis), которое может читать и изменять каждый экземпляр приложения, благодаря чему кэширование остаётся согласованным при развертывании с горизонтальным масштабированием.

Интерфейс IDistributedCache

ASP.NET Core скрывает детали распределённого кэширования за интерфейсом IDistributedCache из Microsoft.Extensions.Caching.Distributed. Ваш код зависит от этого интерфейса, а не напрямую от Redis, поэтому реализацию можно заменить.

public interface IDistributedCache
{
    byte[] Get(string key);
    Task<byte[]> GetAsync(string key, CancellationToken token = default);
    void Set(string key, byte[] value, DistributedCacheEntryOptions options);
    void Remove(string key);
    void Refresh(string key);
}

Он хранит байты

Обратите внимание: кэш хранит данные типа byte[]. Чтобы кэшировать строки или объекты, сначала сериализуйте их. Для распространённого случая существуют удобные методы расширения для строк.

using Microsoft.Extensions.Caching.Distributed;

await cache.SetStringAsync("greeting", "Hello, world");
string value = await cache.GetStringAsync("greeting");

Внедрение кэша

Запросите IDistributedCache через внедрение в конструктор, как и любую другую службу.

public class WeatherService
{
    private readonly IDistributedCache _cache;
    public WeatherService(IDistributedCache cache)
    {
        _cache = cache;
    }
}

Чтение из кэша

GetStringAsync возвращает null, если ключ отсутствует или срок его действия истёк. Всегда обрабатывайте ситуацию промаха кэша.

string cached = await _cache.GetStringAsync("forecast:istanbul");
if (cached is null)
{
    // cache miss: load from source
}

Запись в кэш

SetStringAsync сохраняет значение с необязательными параметрами истечения срока действия (они рассматриваются в следующем уроке).

await _cache.SetStringAsync(
    "forecast:istanbul",
    "22C sunny",
    new DistributedCacheEntryOptions
    {
        AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
    });

Удаление и обновление

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

await _cache.RemoveAsync("forecast:istanbul");
await _cache.RefreshAsync("session:abc123");

Реализация в памяти

Для разработки или проверок зарегистрируйте распределённый кэш в памяти. Он реализует тот же интерфейс, поэтому ваш код остаётся неизменным, но данные фактически не становятся общими для разных процессов.

builder.Services.AddDistributedMemoryCache();

Код, независимый от поставщика

Поскольку вы зависите только от IDistributedCache, переход от поставщика в памяти к Redis (или SQL Server) требует изменения лишь одной строки регистрации, без изменений в коде служб.

Соглашения об именовании ключей

Используйте структурированные ключи с пространствами имён, например entity:id:field (например, user:42:profile). Понятные соглашения предотвращают конфликты и делают предсказуемой инвалидацию кэша.

string key = $"user:{userId}:profile";

Когда не следует использовать кэш

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

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

Проверьте абстракцию IDistributedCache.

Итоги

IDistributedCache скрывает детали внешнего общего кэша, поэтому каждый экземпляр приложения видит одни и те же данные. Он хранит данные типа byte[]; для строк предусмотрены GetStringAsync/SetStringAsync, а также RemoveAsync и RefreshAsync. Зависимость от интерфейса сохраняет код независимым от поставщика: реализацию можно заменить между AddDistributedMemoryCache и Redis одной строкой. Используйте понятные ключи с пространствами имён.

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

Урок «Абстракция IDistributedCache» бесплатный?

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

Чему я научусь в уроке «Абстракция IDistributedCache»?

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

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

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

Сколько времени занимает урок «Абстракция IDistributedCache»?

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

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

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

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

  1. Абстракция IDistributedCache
  2. Подключение к Redis
  3. Шаблоны кэширования и истечение срока действия
  4. Кэширование сериализованных объектов
← Назад к C# Academy