TGViewer
Библиотека шарписта | C#, F#, .NET, ASP.NET Библиотека шарписта | C#, F#, .NET, ASP.NET @csharpproglib · 21.6K subscribers
Post #4816 5.81K
🧰 MemoryCache, DistributedCache и HybridCache: краткий обзор от Steven Giesel новых вич, появившихся в .NET 9 Preview 4

📌 MemoryCache — структура данных для кеширования объектов в памяти.

• Простой пример:

public async Task<IActionResult> GetBlogPost(int id)
{
var cacheKey = $"BlogPost_{id}";
if (!_memoryCache.TryGetValue(cacheKey, out BlogPost blogPost))
{
blogPost = await _blogRepository.GetBlogPostByIdAsync(id);
_memoryCache.Set(cacheKey, blogPost);
}
return Ok(blogPost);
}


• Пример упрощенного использования MemoryCache:

public async Task<IActionResult> GetBlogPost(int id)
{
var cacheKey = $"BlogPost_{id}";
var blogPost = await _memoryCache.GetOrCreateAsync(cacheKey, async entry =>
{
return await _blogRepository.GetBlogPostByIdAsync(id);
});
return Ok(blogPost);
}


📌 IDistributedCache используется для кеширования между несколькими сервисами и/или для сохранения данных на длительный срок (переживание перезагрузок сервера).

• Пример регистрации Redis в качестве провайдера кеша:

builder.Services.AddStackExchangeRedisCache(options => { ... });


• Пример регистрации SQL Server в качестве провайдера кеша:

builder.Services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString = builder.Configuration.GetConnectionString("DistCache_ConnectionString");
options.SchemaName = "dbo";
options.TableName = "TestCache";
});


• Пример использования IDistributedCache:

public class SomeService(IDistributedCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync(string name, int id, CancellationToken token = default)
{
var key = $"someinfo:{name}:{id}";
var bytes = await cache.GetAsync(key, token);
SomeInformation info;
if (bytes is null)
{
info = await SomeExpensiveOperationAsync(name, id, token);
bytes = SomeSerializer.Serialize(info);
await cache.SetAsync(key, bytes, token);
}
else
{
info = SomeSerializer.Deserialize<SomeInformation>(bytes);
}
return info;
}

private async Task<SomeInformation> SomeExpensiveOperationAsync(string name, int id, CancellationToken token = default)
{
// ... Реализация
}
}


📌 HybridCache совмещает функции MemoryCache и DistributedCache. Простой пример использования:

public class SomeService(HybridCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync(string name, int id, CancellationToken token = default)
{
return await cache.GetOrCreateAsync(
$"someinfo:{name}:{id}",
async cancel => await SomeExpensiveOperationAsync(name, id, cancel),
token: token
);
}
}


✅ HybridCache поддерживает явное удаление по ключу, настройку сериализации и позволяет избежать некоторых проблем IDistributedCache.
Steven-Giesel MemoryCache, DistributedCache and HybridCache The latest preview (.NET 9 preview 4) brought another caching structure to the .NET world - so let's order some things here.
  • 👍 18
  • ❤ 2
  • 🤔 1
More from @csharpproglib
  1. Oct 17, 2026⚙️ PeriodicTimer: следующий тик не обязан ждать конца работы Нужно регулярно обновлять дан…
  2. Oct 16, 2026⚙️ Task.WhenAll не ограничивает число запросов Если передать в Task.WhenAll тысячу задач о…
  3. Oct 15, 2026🧑‍💻 Какие навыки помогают вам в разработке в 2026 году? Что вы чаще используете в работе…
  4. Oct 15, 2026🧩 Mapperly: маппинг DTO, который можно открыть и прочитать Вручную перекладывать двадцать…
  5. Oct 14, 2026Post #7290
  6. Oct 14, 2026Общая папка для работы Claude Code и Codex Луи-Франсуа Бушар собрал заметки, инструкции-ск…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →