🧰 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.