Я пытаюсь проверить, как работает кэширование в памяти и на стороне клиента, используя .NET 7.0. Для кэширования в памяти я сохраняю результаты из базы данных в кешированном объекте, и когда срок действия объекта истекает, он снова извлекает данные из базы данных. Поэтому я сделал следующее:
[HttpGet]
[Route("/user/GetUsers")]
public async Task GetUserDetails()
{
myStopWatch.Start();
Task users = GetCachedResponse(CacheKey.users, () => _user.GetUsers());
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return await users;
}
private async Task GetCachedResponse(string cacheKey, Func func)
{
List users = new List();
try
{
users = _cacheProvider.GetFromCache(cacheKey);
if (users != null) return users;
users = await func();
_cacheProvider.SetCache(cacheKey, users, cacheEntryOptions);
}
catch (Exception ex)
{
ex.ToString();
}
return users;
}
Чтобы проверить кэширование клиента, я сделал следующее:
[HttpGet]
[Route("/user/GetAllUsers")]
[ResponseCache(CacheProfileName = "UserCacheForOneMin")]
public async Task GetAllUsers()
{
myStopWatch.Start();
Task users = _user.GetUsers();
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return await users;
}
Я не уверен насчет вышеизложенного, поскольку данные не сохранялись в кэшированном объекте, но я выполнил некоторые настройки в файле Startup.cs как следует для кэширования ответов/клиентов.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.CacheProfiles.Add("UserCacheForOneMin",
new CacheProfile()
{
Duration = 60,
Location = ResponseCacheLocation.Client
});
});
}
public void Configure(WebApplication app, IWebHostEnvironment env)
{
app.UseResponseCaching();
}
Наконец, когда я запускаю приложение, я вижу следующие различия:
[img]https:/ /i.sstatic.net/8Mn6btUT.jpg[/img]
Несмотря на то, что кэширование клиента загружает данные быстрее, я хотел бы знать, как оно на самом деле работает «под капотом» без отдельного хранилища или чего-то подобного. и правильно ли я поступаю?
Примечание. При работе в памяти, если в базу данных добавляется новая запись, объект кэша загружает только кэшированные данные до истечения срока действия. Позже, по истечении срока действия, он показывает данные с вновь добавленными. Но кэширование клиента/ответа каждый раз проверяет наличие данных в базе данных со временем ответа меньшим, чем при кэшировании в памяти. Изображение слева предназначено для кэширования клиента/ответа, правое — для кэширования в памяти.
Обновление 1: согласно комментарию Freakish – Правильное измерение с помощью класса StopWatch
.[HttpGet]
[Route("/user/GetAllUsers")]
[ResponseCache(CacheProfileName = "UserCacheForOneMin")]
public async Task GetAllUsers()
{
myStopWatch.Start();
var users = await _user.GetUsers();
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return users;
}
[HttpGet]
[Route("/user/GetUsers")]
public async Task GetUserDetails()
{
myStopWatch.Start();
var users = await GetCachedResponse(CacheKey.users, () => _user.GetUsers());
myStopWatch.Stop();
double total = myStopWatch.Elapsed.TotalSeconds;
return users;
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... de-caching