🧰
MemoryCache, DistributedCache и HybridCache: краткий обзор от Steven Giesel новых вич, появившихся в .NET 9 Preview 4
📌
MemoryCache
— структура данных для кеширования объектов в памяти.
• Простой пример:
public async Task 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 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 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(bytes);
}
return info;
}
private async Task SomeExpensiveOperationAsync(string name, int id, CancellationToken token = default)
{
// ... Реализация
}
}
📌
HybridCache
совмещает функции
MemoryCache
и
DistributedCache
. Простой пример использования:
public class SomeService(HybridCache cache)
{
public async Task 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
.
Ko'proq ko'rsatish ...