Абстракция 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 — локальная установка не требуется.
Все уроки этого курса
- Абстракция IDistributedCache
- Подключение к Redis
- Шаблоны кэширования и истечение срока действия
- Кэширование сериализованных объектов