Кэширование сериализованных объектов
Сохраняйте и извлекайте сложные объекты.
«Кэширование сериализованных объектов» — бесплатный урок C# Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Кэширование не только строк
Настоящие приложения кэшируют не только строки, но и объекты. Поскольку IDistributedCache хранит байты, необходимо сериализовать объект в представление в виде байтов или строки, а при извлечении выполнить десериализацию. Обычно выбирают JSON.
Сериализация с помощью System.Text.Json
Используйте System.Text.Json, чтобы преобразовать объект в строку JSON, а затем сохраните её с помощью SetStringAsync.
using System.Text.Json;
var product = new Product { Id = 1, Name = "Coffee", Price = 4.5m };
string json = JsonSerializer.Serialize(product);
await _cache.SetStringAsync("product:1", json);Десериализация при чтении
При чтении получите строку JSON и десериализуйте её обратно в нужный тип, не забыв обработать null при промахе кэша.
string json = await _cache.GetStringAsync("product:1");
if (json is null) return null;
Product product = JsonSerializer.Deserialize<Product>(json);Повторно используемый обобщённый помощник
Оберните логику сериализации и десериализации в методы расширения, чтобы вызывающий код мог удобно кэшировать значения любого типа.
public static async Task SetAsync<T>(
this IDistributedCache cache, string key, T value,
DistributedCacheEntryOptions options)
{
string json = JsonSerializer.Serialize(value);
await cache.SetStringAsync(key, json, options);
}Обобщённый помощник Get
Соответствующий метод чтения десериализует данные обратно в T, возвращая default при промахе.
public static async Task<T> GetAsync<T>(
this IDistributedCache cache, string key)
{
string json = await cache.GetStringAsync(key);
return json is null ? default : JsonSerializer.Deserialize<T>(json);
}Шаблон GetOrCreate
Объедините кэш на стороне приложения с сериализацией в одном помощнике: верните объект из кэша либо выполните фабрику, сохраните её результат в кэше и верните его.
public static async Task<T> GetOrCreateAsync<T>(
this IDistributedCache cache, string key,
Func<Task<T>> factory, DistributedCacheEntryOptions options)
{
var existing = await cache.GetAsync<T>(key);
if (existing is not null) return existing;
var created = await factory();
await cache.SetAsync(key, created, options);
return created;
}Использование GetOrCreate
Место вызова превращается в одну строку, скрывающую всю механику кэширования.
var product = await _cache.GetOrCreateAsync(
"product:1",
() => _repository.LoadProductAsync(1),
new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(15)
});Параметры сериализатора
Повторно используйте один экземпляр JsonSerializerOptions (например, с именами в стиле camelCase и игнорированием значений null), чтобы кэшированные данные имели единообразный и компактный формат, а параметры не создавались заново при каждом вызове.
private static readonly JsonSerializerOptions JsonOptions = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
DefaultIgnoreCondition =
System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull
};Версионирование структуры кэшированных данных
Если структура кэшированного типа изменится, старый JSON может не десериализоваться. Включите сегмент версии в ключ, например product:v2:1, чтобы после развёртывания несовместимые записи автоматически обходились.
Сохраняйте данные компактными
Кэшируйте только нужные поля. Чем меньше данные, тем меньше сетевых ресурсов и памяти они используют в Redis и тем быстрее выполняется сериализация при каждом чтении и записи.
Учитывайте стоимость сериализации
Сериализация не бесплатна. Для очень часто выполняемых участков рассмотрите компактные форматы или кэширование предварительно сформированных результатов и всегда измеряйте эффект, чтобы убедиться, что кэш действительно даёт общую выгоду.
Быстрая проверка
Проверьте кэширование сериализованных объектов.
Итоги
Чтобы кэшировать объекты, сериализуйте их (обычно в JSON с помощью System.Text.Json) при записи и десериализуйте при чтении. Обобщённые методы SetAsync<T>/GetAsync<T> и помощник GetOrCreateAsync скрывают механику и корректно реализуют кэш на стороне приложения. Повторно используйте JsonSerializerOptions, обновляйте версии ключей кэша при изменении структуры данных, сохраняйте данные компактными и измеряйте стоимость сериализации на часто выполняемых участках.
Часто задаваемые вопросы
Урок «Кэширование сериализованных объектов» бесплатный?
Да — полный текст урока «Кэширование сериализованных объектов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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 — локальная установка не требуется.
Все уроки этого курса
- Абстракция IDistributedCache
- Подключение к Redis
- Шаблоны кэширования и истечение срока действия
- Кэширование сериализованных объектов